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

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.  *  DataAccountWlanOTAP.c
  40.  *
  41.  * Project:
  42.  * -------- 
  43.  *  MAUI
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  The file implements the functionality for Over-The-Air Provisioning (OTAP)
  48.  *  of WLAN data account. The WLAN OTAP feature is enabled when the MMI WLAN 
  49.  *  data account application is enabled and one of the specification support
  50.  *  is turned on by CCA.
  51.  *  
  52.  *  Currently, two OTAP specifications is implemented in the file.
  53.  *
  54.  * Author:
  55.  * -------
  56.  * -------
  57.  *
  58.  *============================================================================
  59.  *             HISTORY
  60.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  61.  *------------------------------------------------------------------------------
  62.  * removed!
  63.  *
  64.  * removed!
  65.  * removed!
  66.  * removed!
  67.  *
  68.  * removed!
  69.  * removed!
  70.  * removed!
  71.  *
  72.  * removed!
  73.  * removed!
  74.  * removed!
  75.  *
  76.  *------------------------------------------------------------------------------
  77.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  78.  *============================================================================
  79.  ****************************************************************************/
  80. #include "DataAccountCommon.h"
  81. /* 
  82.  * Turn on WLAN OTAP when at least one of OTAP specifications is supported.
  83.  */
  84. #if defined(__MMI_WLAN_OTAP_OMAEXT__) || defined(__MMI_WLAN_OTAP_DMP__)
  85. /* Std C headers. */
  86. #include "limits.h"
  87. /* CCA message ID. */
  88. #include "ProtocolEvents.h"
  89. /* MMI trace. */
  90. #include "kal_trace.h"
  91. #include "DebugInitDef.h"
  92. #include "mmi_trc.h"
  93. /* Conversion between different Unicode encodings. */
  94. #include "Conversions.h"
  95. /* Default profile's name. */
  96. #define DEFAULT_PROFILE_NAME    (L"New Profile")
  97. /* Constants for auto renaming. */
  98. #define DUP_NAME_SUFFIX_PATTERN (L"(00)")   /* Appended pattern         */
  99. #define DUP_NAME_SUFFIX_LEN     (4)         /* Length of pattern        */
  100. #define DUP_NAME_SUFFIX_NUM     (100)       /* Num of values in pattern */
  101. /* WLAN data account control block. */
  102. extern mmi_wlan_profile_struct g_wlan_prof_list[MAX_WLAN_DATA_ACCOUNT_NUM];
  103. extern mmi_wlan_profile_struct *g_wlan_profile[MAX_WLAN_DATA_ACCOUNT_NUM];
  104. extern mmi_wlan_display_struct g_wlan_display_context;
  105. extern mmi_wlan_setting_struct g_wlan_setting_context;
  106. /* Since the application has the property that it is only triggered when a
  107.    configuration document is arrived, we dynamically allocate the control 
  108.    block to save memory. */
  109. static mmi_wlan_otap_struct *g_wlan_otap = NULL;
  110. /*
  111.  * Private function prototypes.
  112.  */
  113. static S32 mmi_wlan_hex_to_dec(U8 input);
  114. static MMI_BOOL mmi_wlan_hex_to_psk(U8 *dst, const U8 *src, S32 len);
  115. static MMI_BOOL mmi_wlan_is_ascii_string(const U8 *utf8_str);
  116. static MMI_BOOL mmi_wlan_is_appended_pattern(const U8 *name, U8 *value);
  117. static void mmi_wlan_update_appended_pattern(U8 *dup_name, const U8 **name, U8 num_names);
  118. static void mmi_wlan_resolve_duplicate_name(U8 *dup_name, const U8 **name, U8 num_names);
  119. static void mmi_wlan_send_cca_app_configure_rsp(U16 conf_id, S32 doc_hdl, cca_status_enum status);
  120. static mmi_wlan_otap_struct *mmi_wlan_new_otap_cntx(U16 conf_id, S32 doc_hdl);
  121. static void mmi_wlan_free_otap_cntx(void);
  122. static U8 mmi_wlan_abort_otap_app(void *dummy);
  123. static void mmi_wlan_init_slim_profile(mmi_wlan_slim_profile_struct *prof);
  124. static S16 mmi_wlan_new_otap_profile(mmi_wlan_otap_struct *cntx);
  125. static void mmi_wlan_free_otap_profile(mmi_wlan_otap_struct *cntx, S16 index);
  126. static MMI_BOOL mmi_wlan_validate_wep_key(const mmi_wlan_slim_profile_struct * prof);
  127. static MMI_BOOL mmi_wlan_validate_profile(const mmi_wlan_slim_profile_struct *prof);
  128. static void mmi_wlan_show_info(U16 msg_id);
  129. static void mmi_wlan_provision_profile(mmi_wlan_profile_struct *dst, const mmi_wlan_slim_profile_struct *src);
  130. static U8 mmi_wlan_install_profiles(void);
  131. static void mmi_wlan_auto_rename_profile(S16 src_idx);
  132. static MMI_BOOL mmi_wlan_is_duplicate_name(S16 src_idx);
  133. static void mmi_wlan_replacement_save(void);
  134. static void mmi_wlan_entry_replacement_confirm(void);
  135. static void mmi_wlan_replacement_highlight_hdlr(S32 index);
  136. static void mmi_wlan_entry_replacement(void);
  137. static MMI_BOOL mmi_wlan_is_empty_profile(U8 i);
  138. static void mmi_wlan_next_profile(void);
  139. static void mmi_wlan_find_empty_profile(void);
  140. static void mmi_wlan_entry_installation(void);
  141. /*****************************************************************************
  142.  * FUNCTION
  143.  *  mmi_wlan_hex_to_dec
  144.  * DESCRIPTION
  145.  *  This function converts a hexadecimal character to its decimal value.
  146.  * PARAMETERS
  147.  *  input           [IN]            Input hexadecimal character
  148.  * RETURNS
  149.  *  If input is a hexadecimal character, return its decimal value. Otherwise,
  150.  *  return -1.
  151.  *****************************************************************************/
  152. S32 mmi_wlan_hex_to_dec(U8 input)
  153. {
  154.     /*----------------------------------------------------------------*/
  155.     /* Local Variables                                                */
  156.     /*----------------------------------------------------------------*/
  157.     
  158.     /*----------------------------------------------------------------*/
  159.     /* Code Body                                                      */
  160.     /*----------------------------------------------------------------*/
  161.     if (input >= '0' && input <= '9') 
  162.     {
  163.         return input - '0';
  164.     } 
  165.     else if (input >= 'a' && input <= 'f')
  166.     {
  167.         return input - 'a' + 10;    
  168.     }
  169.     else if (input >= 'A' && input <= 'F')
  170.     {
  171.         return input - 'A' + 10;
  172.     }
  173.     else
  174.     {
  175.         return -1;
  176.     }
  177. }
  178. /*****************************************************************************
  179.  * FUNCTION
  180.  *  mmi_wlan_hex_to_psk
  181.  * DESCRIPTION
  182.  *  This function converts a hexadecimal character string to the pre-shared
  183.  *  key, where each hexadecimal character represents 4-bits in the destination.
  184.  * PARAMETERS
  185.  *  dst             [OUT]           Output raw data
  186.  *  src             [IN]            Input hexadecimal character string
  187.  *  len             [IN]            Length of the string
  188.  * RETURNS
  189.  *  On success, return TRUE. On error, return FALSE.
  190.  *****************************************************************************/
  191. MMI_BOOL mmi_wlan_hex_to_psk(U8 *dst, const U8 *src, S32 len)
  192. {
  193.     /*----------------------------------------------------------------*/
  194.     /* Local Variables                                                */
  195.     /*----------------------------------------------------------------*/
  196.     U8 msb, lsb;
  197.     S32 ret;
  198.     S32 i;
  199.     /*----------------------------------------------------------------*/
  200.     /* Code Body                                                      */
  201.     /*----------------------------------------------------------------*/
  202.     
  203.     if (len % 2 != 0) 
  204.     {
  205.         return MMI_FALSE;
  206.     }
  207.     
  208.     for (i = 0; i < len; i += 2)
  209.     {
  210.         if ((ret = mmi_wlan_hex_to_dec(src[i])) < 0) 
  211.         {
  212.             return MMI_FALSE;
  213.         }
  214.         msb= (U8)ret;
  215.         if ((ret = mmi_wlan_hex_to_dec(src[i + 1])) < 0) 
  216.         {
  217.             return MMI_FALSE;
  218.         }
  219.         lsb = (U8)ret;
  220.         
  221.         dst[i / 2] = (msb << 4) + lsb;
  222.     }
  223.     return MMI_TRUE;
  224. }
  225. /*****************************************************************************
  226.  * FUNCTION
  227.  *  mmi_wlan_is_ascii_string
  228.  * DESCRIPTION
  229.  *  This function checks whether the input UTF-8 encoded string is an ASCII
  230.  *  string.
  231.  * PARAMETERS
  232.  *  utf8_str        [IN]            Input UTF-8 encoded string
  233.  * RETURNS
  234.  *  If input string is ASCII string, return TRUE. Otherwise, return FALSE.
  235.  *****************************************************************************/
  236. MMI_BOOL mmi_wlan_is_ascii_string(const U8 *utf8_str)
  237. {
  238.     /*----------------------------------------------------------------*/
  239.     /* Local Variables                                                */
  240.     /*----------------------------------------------------------------*/
  241.     
  242.     /*----------------------------------------------------------------*/
  243.     /* Code Body                                                      */
  244.     /*----------------------------------------------------------------*/
  245.     /* If this is an ASCII string, each octet should be an ASCII character. */
  246.     for ( ; *utf8_str != ''; ++utf8_str)
  247.     {
  248.         if (*utf8_str > 0x7F) 
  249.         {
  250.             return MMI_FALSE;
  251.         }
  252.     }
  253.     
  254.     return MMI_TRUE;
  255. }
  256. /*****************************************************************************
  257.  * FUNCTION
  258.  *  mmi_wlan_is_appended_pattern
  259.  * DESCRIPTION
  260.  *  This function examines whether the name has an appended pattern (dd).
  261.  *  If the name has the pattern and value is not NULL, set value to dd.
  262.  * PARAMETERS
  263.  *  name            [IN]            Name to be examined
  264.  *  value           [OUT]           Return the value of dd
  265.  * RETURNS
  266.  *  If name has an appended pattern, return TRUE. Otherwise, return FALSE.
  267.  *****************************************************************************/
  268. MMI_BOOL mmi_wlan_is_appended_pattern(const U8 *name, U8 *value)
  269. {
  270.     /*----------------------------------------------------------------*/
  271.     /* Local Variables                                                */
  272.     /*----------------------------------------------------------------*/
  273.     const U8 *start, *end, *iter;
  274.     S32 str_len;
  275.     
  276.     /*----------------------------------------------------------------*/
  277.     /* Code Body                                                      */
  278.     /*----------------------------------------------------------------*/
  279.     str_len = UCS2Strlen((S8 *)name);
  280.     /* Examine whether the name has the appended pattern. */
  281.     if (str_len < DUP_NAME_SUFFIX_LEN) 
  282.     {
  283.         return MMI_FALSE;
  284.     } 
  285.     else 
  286.     {
  287.         start = name + (str_len - DUP_NAME_SUFFIX_LEN) * ENCODING_LENGTH;
  288.         end   = name + (str_len - 1) * ENCODING_LENGTH;
  289.         if (*start != '(' || *(start + 1) != '') 
  290.         {
  291.             return MMI_FALSE;
  292.         }
  293.         if (*end != ')' || *(end + 1) != '') 
  294.         {
  295.             return MMI_FALSE;
  296.         }
  297.         for (iter = start + ENCODING_LENGTH; iter != end; iter += ENCODING_LENGTH) 
  298.         {
  299.             if (*iter < '0' || *iter > '9' || *(iter + 1) != '') 
  300.             {
  301.                 return MMI_FALSE;
  302.             }
  303.         }
  304.     }
  305.     /* Save the value in the pattern. */
  306.     if (value != NULL) 
  307.     {
  308.         start = name + (str_len - 3) * ENCODING_LENGTH; /* decimal  */
  309.         end   = name + (str_len - 2) * ENCODING_LENGTH; /* unit     */
  310.         *value = (*start - '0') * 10 + (*end - '0');
  311.     }
  312.     
  313.     return MMI_TRUE;
  314. }
  315. /*****************************************************************************
  316.  * FUNCTION
  317.  *  mmi_wlan_update_appended_pattern
  318.  * DESCRIPTION
  319.  *  The function updates the values of the pattern (dd) in the duplicate 
  320.  *  name.
  321.  * PARAMETERS
  322.  *  dup_name        [IN/OUT]        The name to be updated
  323.  *  name            [IN]            The other names
  324.  *  num_names       [IN]            Number of the other names
  325.  * RETURNS
  326.  *  void
  327.  *****************************************************************************/
  328. void mmi_wlan_update_appended_pattern(U8 *dup_name, const U8 **name, U8 num_names)
  329. {
  330.     /*----------------------------------------------------------------*/
  331.     /* Local Variables                                                */
  332.     /*----------------------------------------------------------------*/
  333.     U8 map[DUP_NAME_SUFFIX_NUM];
  334.     U8 value, min;
  335.     S32 str_len;
  336.     U8 i;
  337.     
  338.     /*----------------------------------------------------------------*/
  339.     /* Code Body                                                      */
  340.     /*----------------------------------------------------------------*/
  341.     /* Initialize the map. All numbers are not used. */
  342.     memset(map, 0, DUP_NAME_SUFFIX_NUM);
  343.     str_len = UCS2Strlen((S8 *)dup_name);
  344.     /* Mark used values as one. */ 
  345.     for (i = 0; i < num_names; ++i)
  346.     {
  347.         /* String length must be identical. */
  348.         if (str_len != UCS2Strlen((S8 *)name[i])) 
  349.         {
  350.             continue;
  351.         }
  352.         
  353.         /* Prefix of names must be the same as the prefix of duplicate name. */
  354.         if (UCS2Strncmp((S8 *)dup_name, (S8 *)name[i], str_len - DUP_NAME_SUFFIX_LEN) != 0) 
  355.         {
  356.             continue;
  357.         }
  358.         
  359.         if (mmi_wlan_is_appended_pattern(name[i], &value) == MMI_TRUE) 
  360.         {
  361.             map[value] = 1;
  362.         }
  363.     }
  364.     /* Find the minimum unused position. If all values are used, still produce
  365.        a pattern with a duplicate value 99. */
  366.     min = DUP_NAME_SUFFIX_NUM - 1;
  367.     
  368.     for (i = 1; i < DUP_NAME_SUFFIX_NUM; ++i) 
  369.     {
  370.         if (map[i] == 0) 
  371.         {
  372.             min = i;
  373.             break;
  374.         }
  375.     }
  376.     /* Update the value in the pattern. */
  377.     *(dup_name + (str_len - 2) * ENCODING_LENGTH) = (min % 10) + '0';
  378.     *(dup_name + (str_len - 3) * ENCODING_LENGTH) = (min / 10) + '0';
  379. }
  380. /*****************************************************************************
  381.  * FUNCTION
  382.  *  mmi_wlan_resolve_duplicate_name
  383.  * DESCRIPTION
  384.  *  This function updates the duplicate name according to the circumstance of
  385.  *  the name array.
  386.  * PARAMETERS
  387.  *  dup_name        [IN/OUT]        The duplicate name to be updated
  388.  *  name            [IN]            The other names
  389.  *  num_names       [IN]            Number of the other names
  390.  * RETURNS
  391.  *  void
  392.  *****************************************************************************/
  393. void mmi_wlan_resolve_duplicate_name(U8 *dup_name, const U8 **name, U8 num_names)
  394. {
  395.     /*----------------------------------------------------------------*/
  396.     /* Local Variables                                                */
  397.     /*----------------------------------------------------------------*/
  398.     S32 str_len;
  399.     U8 *ptr;
  400.     
  401.     /*----------------------------------------------------------------*/
  402.     /* Code Body                                                      */
  403.     /*----------------------------------------------------------------*/
  404.     /* If tail does not have an appended pattern (dd), append a pattern. */
  405.     if (mmi_wlan_is_appended_pattern(dup_name, NULL) == MMI_FALSE) 
  406.     {
  407.         str_len = UCS2Strlen((S8 *)dup_name);
  408.         /* Whether spaces are enough for appending the pattern (dd). */
  409.         if (str_len + DUP_NAME_SUFFIX_LEN + 1 > MAX_WLAN_PROF_NAME_LEN) 
  410.         {
  411.             /* Spaces are not enough. Truncate the tail. */
  412.             ptr = dup_name + (MAX_WLAN_PROF_NAME_LEN - 1 - DUP_NAME_SUFFIX_LEN) * ENCODING_LENGTH;
  413.             *(ptr)     = '';
  414.             *(ptr + 1) = '';
  415.         }
  416.         
  417.         UCS2Strcat((S8 *)dup_name, (S8 *)DUP_NAME_SUFFIX_PATTERN);
  418.     }
  419.     /* Update the values in the pattern. */
  420.     mmi_wlan_update_appended_pattern(dup_name, name, num_names);
  421. }
  422. /*****************************************************************************
  423.  * FUNCTION
  424.  *  mmi_wlan_send_cca_app_configure_rsp
  425.  * DESCRIPTION
  426.  *  This function sends the response message back to CCA for the result of 
  427.  *  configuration. Once application sends this primitive, no further access
  428.  *  to the configuration document should be made.
  429.  * PARAMETERS
  430.  *  conf_id         [IN]            CCA configuration ID
  431.  *  doc_hdl         [IN]            Configuration document handle
  432.  *  status          [IN]            Configuration result
  433.  * RETURNS
  434.  *  void
  435.  *****************************************************************************/
  436. void mmi_wlan_send_cca_app_configure_rsp(U16 conf_id, S32 doc_hdl, cca_status_enum status)
  437. {
  438.     /*----------------------------------------------------------------*/
  439.     /* Local Variables                                                */
  440.     /*----------------------------------------------------------------*/
  441.     MYQUEUE message;
  442.     mmi_cca_app_configure_rsp_struct *data;
  443.         
  444.     /*----------------------------------------------------------------*/
  445.     /* Code Body                                                      */
  446.     /*----------------------------------------------------------------*/    
  447.     MMI_TRACE((MMI_TRACE_G7_MISC, MMI_CCA_WLAN_SEND_RSP, status));
  448.     /* Allocate memory. It will assert on error. */
  449.     data = (mmi_cca_app_configure_rsp_struct *)OslConstructDataPtr(sizeof(mmi_cca_app_configure_rsp_struct));
  450.     data->config_id = conf_id;
  451.     data->hConfig   = doc_hdl;
  452.     data->status    = status;
  453.     /* Send the response message. */
  454.     message.oslSrcId        = MOD_MMI;
  455.     message.oslDestId       = MOD_MMI;
  456.     message.oslMsgId        = PRT_MMI_CCA_APP_CONFIGURE_RSP;
  457.     message.oslDataPtr      = (oslParaType *)data;
  458.     message.oslPeerBuffPtr  = NULL;
  459.     
  460.     OslMsgSendExtQueue(&message);
  461. }
  462. /*****************************************************************************
  463.  * FUNCTION
  464.  *  mmi_wlan_new_otap_cntx
  465.  * DESCRIPTION
  466.  *  This function allocates and initializes the control block of WLAN OTA
  467.  *  provisioning application.
  468.  * PARAMETERS
  469.  *  conf_id         [IN]            CCA configuration ID
  470.  *  doc_hdl         [IN]            Configuration document handle
  471.  * RETURNS
  472.  *  On success, return the address of control block. On error, return NULL.
  473.  *****************************************************************************/
  474. mmi_wlan_otap_struct *mmi_wlan_new_otap_cntx(U16 conf_id, S32 doc_hdl)
  475. {
  476.     /*----------------------------------------------------------------*/
  477.     /* Local Variables                                                */
  478.     /*----------------------------------------------------------------*/
  479.     mmi_wlan_otap_struct *cntx;
  480.     U8 i;
  481.     
  482.     /*----------------------------------------------------------------*/
  483.     /* Code Body                                                      */
  484.     /*----------------------------------------------------------------*/
  485.     /* Allocate the control block. Must be successful. */
  486.     cntx = (mmi_wlan_otap_struct *)OslMalloc(sizeof(mmi_wlan_otap_struct));
  487.     if (cntx == NULL) 
  488.     {
  489.         return NULL;
  490.     }
  491.     /* Clear the entire structure. */
  492.     memset(cntx, 0, sizeof(mmi_wlan_otap_struct));
  493.     /* Save the identifier for this configuration process. */
  494.     cntx->conf_id = conf_id;
  495.     cntx->doc_hdl = doc_hdl;
  496.     /* Allow to process nodes and parameters until a NAPDEF node comes. */
  497.     cntx->is_active = MMI_FALSE;
  498.     /* Initialize the index for replacement to an invalid index. */
  499.     for (i = 0; i < MAX_WLAN_OTA_PROF_NUM; ++i) 
  500.     {
  501.         cntx->dst_idx[i] = -1;
  502.     }
  503.     /* Initialize the index for replacement to an invalid index. */
  504.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  505.     {
  506.         cntx->src_idx[i]     = -1;
  507.         cntx->sel_dst_idx[i] = -1;
  508.     }
  509.     
  510.     return cntx;
  511. }
  512. /*****************************************************************************
  513.  * FUNCTION
  514.  *  mmi_wlan_free_otap_cntx
  515.  * DESCRIPTION
  516.  *  The function frees memory of the control block, and clears the global ptr.
  517.  * PARAMETERS
  518.  *  void
  519.  * RETURNS
  520.  *  void
  521.  *****************************************************************************/
  522. void mmi_wlan_free_otap_cntx(void)
  523. {
  524.     /*----------------------------------------------------------------*/
  525.     /* Local Variables                                                */
  526.     /*----------------------------------------------------------------*/
  527.     U8 i;
  528.     
  529.     /*----------------------------------------------------------------*/
  530.     /* Code Body                                                      */
  531.     /*----------------------------------------------------------------*/
  532.     /* Nothing to do. Return. */
  533.     if (g_wlan_otap == NULL) 
  534.     {
  535.         return;
  536.     }
  537.     
  538.     /* Free all profiles. */
  539.     for (i = 0; i < g_wlan_otap->num_profiles; ++i) 
  540.     {
  541.         OslMfree(g_wlan_otap->profile[i]);
  542.     }
  543.     /* Free the control block. */
  544.     OslMfree(g_wlan_otap);
  545.     g_wlan_otap = NULL;
  546. }
  547. /*****************************************************************************
  548.  * FUNCTION
  549.  *  mmi_wlan_abort_otap_app
  550.  * DESCRIPTION
  551.  *  This function should be called to exit the WLAN OTAP application. It is 
  552.  *  registered as a delete screen callback such that it can be called when END
  553.  *  key is pressed to return to idle screen.
  554.  * PARAMETERS
  555.  *  dummy           [IN]            Dummy parameter. Always be zero.
  556.  * RETURNS
  557.  *  When END key is pressed to return to idle screen, return TRUE to stop 
  558.  *  delete other nodes in history stack. Here, always return FALSE.
  559.  *****************************************************************************/
  560. U8 mmi_wlan_abort_otap_app(void *dummy)
  561. {
  562.     /*----------------------------------------------------------------*/
  563.     /* Local Variables                                                */
  564.     /*----------------------------------------------------------------*/
  565.     
  566.     /*----------------------------------------------------------------*/
  567.     /* Code Body                                                      */
  568.     /*----------------------------------------------------------------*/
  569.     /* Terminated. Send a response back to CCA and free memory. */    
  570.     mmi_wlan_send_cca_app_configure_rsp(g_wlan_otap->conf_id, g_wlan_otap->doc_hdl, CCA_STATUS_ENDKEY_PRESSED);
  571.     mmi_wlan_free_otap_cntx();
  572.     
  573.     return MMI_FALSE;
  574. }
  575. /*****************************************************************************
  576.  * FUNCTION
  577.  *  mmi_wlan_init_slim_profile
  578.  * DESCRIPTION
  579.  *  This function initializes a slim WLAN profile.
  580.  * PARAMETERS
  581.  *  prof            [OUT]           Profile to be initialized
  582.  * RETURNS
  583.  *  void
  584.  *****************************************************************************/
  585. void mmi_wlan_init_slim_profile(mmi_wlan_slim_profile_struct *prof)
  586. {
  587.     /*----------------------------------------------------------------*/
  588.     /* Local Variables                                                */
  589.     /*----------------------------------------------------------------*/
  590.     
  591.     /*----------------------------------------------------------------*/
  592.     /* Code Body                                                      */
  593.     /*----------------------------------------------------------------*/
  594.     memset(prof, 0, sizeof(mmi_wlan_slim_profile_struct));
  595.     UCS2Strcpy((S8 *)prof->name, (S8 *)DEFAULT_PROFILE_NAME);
  596.     
  597.     prof->network_type   = WLAN_NETWORK_TYPE_INFRA;
  598.     prof->encrypt_mode   = WLAN_ENCRYPT_MODE_NONE;
  599.     prof->auth_mode      = WLAN_AUTH_MODE_OPEN;
  600.     
  601.     prof->wep_key_index  = MAX_WEP_KEY_NUM;             /* Invalid index    */
  602.     prof->wep_key_len    = WLAN_WEP_KEY_ENCRYPT_TOTAL;  /* Invalid key len  */
  603.     prof->wep_key_format = WLAN_WEP_KEY_FORMAT_ASCII;
  604. }
  605. /*****************************************************************************
  606.  * FUNCTION
  607.  *  mmi_wlan_new_otap_profile
  608.  * DESCRIPTION
  609.  *  This function allocates a temporary storage for WLAN profile. And it will 
  610.  *  turn on the flag such that we can process subsequent nodes/parameters
  611.  *  again.
  612.  * PARAMETERS
  613.  *  cntx            [IN]            control block for WLAN OTA provisioning
  614.  * RETURNS
  615.  *  On success, return the index of the newly allocated profile. Otherwise, 
  616.  *  return -1, i.e., an invalid index.
  617.  *****************************************************************************/
  618. S16 mmi_wlan_new_otap_profile(mmi_wlan_otap_struct *cntx)
  619. {
  620.     /*----------------------------------------------------------------*/
  621.     /* Local Variables                                                */
  622.     /*----------------------------------------------------------------*/
  623.     S16 index;
  624.     
  625.     /*----------------------------------------------------------------*/
  626.     /* Code Body                                                      */
  627.     /*----------------------------------------------------------------*/    
  628.     /* No more temporary profile storage. */
  629.     if (cntx->num_profiles == MAX_WLAN_OTA_PROF_NUM) 
  630.     {
  631.         return -1;
  632.     }
  633.     
  634.     /* Obtain the index. */
  635.     index = cntx->num_profiles;
  636.     
  637.     /* Allocate memory for the profile. */
  638.     cntx->profile[index] = (mmi_wlan_slim_profile_struct *)OslMalloc(sizeof(mmi_wlan_slim_profile_struct));
  639.     if (cntx->profile[index] == NULL) 
  640.     {
  641.         return -1;
  642.     }
  643.     /* Initialize the allocated slim WLAN profile. */
  644.     mmi_wlan_init_slim_profile(cntx->profile[index]);
  645.     /* Now, we can update the number of profiles. */
  646.     ++cntx->num_profiles;
  647.     return index;
  648. }
  649. /*****************************************************************************
  650.  * FUNCTION
  651.  *  mmi_wlan_free_otap_profile
  652.  * DESCRIPTION
  653.  *  This function frees the specified profile in the control block.
  654.  * PARAMETERS
  655.  *  cntx            [IN]            Control block of WLAN OTA provisioning
  656.  *  index           [IN]            Index of the profile to be freed
  657.  * RETURNS
  658.  *  void
  659.  *****************************************************************************/
  660. void mmi_wlan_free_otap_profile(mmi_wlan_otap_struct *cntx, S16 index)
  661. {
  662.     /*----------------------------------------------------------------*/
  663.     /* Local Variables                                                */
  664.     /*----------------------------------------------------------------*/
  665.     S16 i;
  666.     
  667.     /*----------------------------------------------------------------*/
  668.     /* Code Body                                                      */
  669.     /*----------------------------------------------------------------*/    
  670.     /* Whether the index is legal. */
  671.     if (index >= cntx->num_profiles) 
  672.     {
  673.         MMI_ASSERT(0);
  674.     }
  675.     
  676.     /* Release the specified profile. */
  677.     OslMfree(cntx->profile[index]);
  678.     /* Shift the other profiles. */
  679.     for (i = index + 1; i < cntx->num_profiles; ++i) 
  680.     {
  681.         cntx->profile[i - 1] = cntx->profile[i];
  682.     }
  683.     cntx->profile[cntx->num_profiles - 1] = NULL;
  684.     /* Now, we can update the number of profiles. */
  685.     --cntx->num_profiles;
  686. }
  687. /*****************************************************************************
  688.  * FUNCTION
  689.  *  mmi_wlan_validate_eap
  690.  * DESCRIPTION
  691.  *  The function validates whether a correct EAP setting is presented.
  692.  * PARAMETERS
  693.  *  prof            [IN]            A provisioned profile    
  694.  * RETURNS
  695.  *  On success, return TRUE. Otherwise, return FALSE.
  696.  *****************************************************************************/
  697. MMI_BOOL mmi_wlan_validate_eap(const mmi_wlan_slim_profile_struct *prof)
  698. {
  699.     /*----------------------------------------------------------------*/
  700.     /* Local Variables                                                */
  701.     /*----------------------------------------------------------------*/
  702.     
  703.     /*----------------------------------------------------------------*/
  704.     /* Code Body                                                      */
  705.     /*----------------------------------------------------------------*/
  706.     /* Currently, only EAP-SIM is supported. */
  707.     if (prof->auth_type1 != WLAN_EAP_SIM) 
  708.     {
  709.         return MMI_FALSE;
  710.     }
  711.     
  712.     /* Whether the username/password have been provided. */
  713.     if (strlen((S8 *)prof->username) == 0 || strlen((S8 *)prof->password) == 0) 
  714.     {
  715.         return MMI_FALSE;
  716.     }
  717.     
  718.     return MMI_TRUE;
  719. }
  720. /*****************************************************************************
  721.  * FUNCTION
  722.  *  mmi_wlan_validate_wep_key
  723.  * DESCRIPTION
  724.  *  The function validates whether a correct WEP key is presented.
  725.  * PARAMETERS
  726.  *  prof            [IN]            A provisioned profile    
  727.  * RETURNS
  728.  *  On success, return TRUE. Otherwise, return FALSE.
  729.  *****************************************************************************/
  730. MMI_BOOL mmi_wlan_validate_wep_key(const mmi_wlan_slim_profile_struct *prof)
  731. {
  732.     /*----------------------------------------------------------------*/
  733.     /* Local Variables                                                */
  734.     /*----------------------------------------------------------------*/
  735.     S32 str_len;
  736.     
  737.     /*----------------------------------------------------------------*/
  738.     /* Code Body                                                      */
  739.     /*----------------------------------------------------------------*/
  740.     /* Whether the wep key index is legal. */
  741.     if (prof->wep_key_index >= MAX_WEP_KEY_NUM) 
  742.     {
  743.         return MMI_FALSE;
  744.     }
  745.     /* Return TRUE if WEP setting are meaningful. */
  746.     str_len = strlen((S8 *)prof->wep_key);
  747.     if (prof->wep_key_len == WLAN_WEP_KEY_ENCRYPT_64 && 
  748.         prof->wep_key_format == WLAN_WEP_KEY_FORMAT_ASCII)
  749.     {
  750.         return str_len == 5? MMI_TRUE: MMI_FALSE;   /* WEP64, ASCII  */
  751.     }
  752.     else if (prof->wep_key_len == WLAN_WEP_KEY_ENCRYPT_64 && 
  753.              prof->wep_key_format == WLAN_WEP_KEY_FORMAT_HEX)
  754.     {
  755.         return str_len == 10? MMI_TRUE: MMI_FALSE;  /* WEP64, HEX    */
  756.     }
  757.     else if (prof->wep_key_len == WLAN_WEP_KEY_ENCRYPT_128 && 
  758.              prof->wep_key_format == WLAN_WEP_KEY_FORMAT_ASCII)
  759.     {
  760.         return str_len == 13? MMI_TRUE: MMI_FALSE;  /* WEP128, ASCII */
  761.     }
  762.     else if (prof->wep_key_len == WLAN_WEP_KEY_ENCRYPT_128 && 
  763.              prof->wep_key_format == WLAN_WEP_KEY_FORMAT_HEX)
  764.     {
  765.         return str_len == 26? MMI_TRUE: MMI_FALSE;  /* WEP128, HEX   */
  766.     }
  767.     /* All other situations are illegal. Return FALSE. */
  768.     return MMI_FALSE;
  769. }
  770. /*****************************************************************************
  771.  * FUNCTION
  772.  *  mmi_wlan_validate_profile
  773.  * DESCRIPTION
  774.  *  The function validates a provisioned profile.
  775.  * PARAMETERS
  776.  *  prof            [IN]            A provisioned profile    
  777.  * RETURNS
  778.  *  On success, return TRUE. Otherwise, return FALSE.
  779.  *****************************************************************************/
  780. MMI_BOOL mmi_wlan_validate_profile(const mmi_wlan_slim_profile_struct *prof)
  781. {
  782.     /*----------------------------------------------------------------*/
  783.     /* Local Variables                                                */
  784.     /*----------------------------------------------------------------*/
  785.     
  786.     /*----------------------------------------------------------------*/
  787.     /* Code Body                                                      */
  788.     /*----------------------------------------------------------------*/
  789.     /* NAPDEF node's node ID */
  790.     if (mmi_chset_utf8_strlen((kal_uint8 *)prof->node_id) == 0) 
  791.     {
  792.         return MMI_FALSE;
  793.     }
  794.     /* Name */
  795.     if (UCS2Strlen((S8 *)prof->name) == 0) 
  796.     {
  797.         return MMI_FALSE;    
  798.     }
  799.     
  800.     /* SSID */
  801.     if (prof->ssid_len == 0) 
  802.     {
  803.         return MMI_FALSE;
  804.     }
  805.     /* Network type. Ad-hoc network does not has authentication server.
  806.        IEEE802.1X and WPA need authentication server and can't be used. */
  807.     if (prof->network_type == WLAN_NETWORK_TYPE_ADHOC && 
  808.         (prof->auth_mode == WLAN_AUTH_MODE_IEEE8021X || 
  809.          prof->auth_mode == WLAN_AUTH_MODE_WPA))
  810.     {
  811.         return MMI_FALSE;
  812.     }
  813.     /* 
  814.      * Authentication mode 
  815.      */
  816.     switch (prof->auth_mode)
  817.     {
  818.         case WLAN_AUTH_MODE_OPEN:
  819.             /* OPEN must turn on NONE or WEP encryption. */
  820.             if (prof->encrypt_mode != WLAN_ENCRYPT_MODE_NONE && 
  821.                 prof->encrypt_mode != WLAN_ENCRYPT_MODE_WEP)
  822.             {
  823.                 return MMI_FALSE;
  824.             }
  825.             break;
  826.             
  827.         case WLAN_AUTH_MODE_SHARED:
  828.             /* SHARED must turn on NONE or WEP encryption. */
  829.             if (prof->encrypt_mode != WLAN_ENCRYPT_MODE_NONE && 
  830.                 prof->encrypt_mode != WLAN_ENCRYPT_MODE_WEP)
  831.             {
  832.                 return MMI_FALSE;
  833.             }
  834.             /* SHARED alwalys needs a correct WEP key. */
  835.             if (mmi_wlan_validate_wep_key(prof) == MMI_FALSE) {
  836.                 return MMI_FALSE;
  837.             }
  838.             break;
  839.                 
  840.         case WLAN_AUTH_MODE_IEEE8021X:
  841.             /* IEEE802.1X must turn on WEP encryption. */
  842.             if (prof->encrypt_mode != WLAN_ENCRYPT_MODE_WEP) 
  843.             {
  844.                 return MMI_FALSE;
  845.             }
  846.             if (mmi_wlan_validate_eap(prof) == MMI_FALSE)
  847.             {
  848.                 return MMI_FALSE;
  849.             }
  850.             break;
  851.             
  852.         case WLAN_AUTH_MODE_WPA:
  853.             /* WPA must turn on TKIP or AES encryption. */
  854.             if (prof->encrypt_mode != WLAN_ENCRYPT_MODE_TKIP && 
  855.                 prof->encrypt_mode != WLAN_ENCRYPT_MODE_AES) 
  856.             {
  857.                 return MMI_FALSE;
  858.             }
  859.             
  860.             if (mmi_wlan_validate_eap(prof) == MMI_FALSE)
  861.             {
  862.                 return MMI_FALSE;
  863.             }
  864.             break;
  865.         case WLAN_AUTH_MODE_WPAPSK:
  866.             /* WPA-PSK must turn on TKIP or AES. */
  867.             if (prof->encrypt_mode != WLAN_ENCRYPT_MODE_TKIP && 
  868.                 prof->encrypt_mode != WLAN_ENCRYPT_MODE_AES) 
  869.             {
  870.                 return MMI_FALSE;
  871.             }
  872.             break;
  873.             
  874.         default:
  875.             return MMI_FALSE; /* Discard profile */
  876.     }
  877.     
  878.     /* 
  879.      * Encryption mode
  880.      */
  881.     switch (prof->encrypt_mode)
  882.     {
  883.         case WLAN_ENCRYPT_MODE_NONE:
  884.             break;
  885.             
  886.         case WLAN_ENCRYPT_MODE_WEP:
  887.             /* Whether WEP key is correctly presented except under IEEE802.1X, 
  888.                which provides the key automatically. */
  889.             if (prof->auth_mode != WLAN_AUTH_MODE_IEEE8021X && 
  890.                 mmi_wlan_validate_wep_key(prof) == MMI_FALSE) 
  891.             {
  892.                 return MMI_FALSE;
  893.             }
  894.             break;
  895.         case WLAN_ENCRYPT_MODE_TKIP:
  896.         case WLAN_ENCRYPT_MODE_AES:
  897.             /* Whether psk or passphrase is presented. Note that WPA don't
  898.                need to provide key here. It uses dynamic key. */
  899.             if (prof->auth_mode != WLAN_AUTH_MODE_WPA && 
  900.                 prof->psk[32] == 0 && prof->passphrase[0] == '') 
  901.             {
  902.                 return MMI_FALSE;
  903.             }
  904.             break;
  905.         default:
  906.             return MMI_FALSE; /* Discard profile */
  907.     }
  908.     return MMI_TRUE;
  909. }
  910. /*****************************************************************************
  911.  * FUNCTION
  912.  *  mmi_wlan_show_info
  913.  * DESCRIPTION
  914.  *  This function shows a notification screen with the specified message.
  915.  * PARAMETERS
  916.  *  msg_id          [IN]            Message to be shown
  917.  * RETURNS
  918.  *  void
  919.  *****************************************************************************/
  920. void mmi_wlan_show_info(U16 msg_id)
  921. {
  922.     /*----------------------------------------------------------------*/
  923.     /* Local Variables                                                */
  924.     /*----------------------------------------------------------------*/
  925.     /*----------------------------------------------------------------*/
  926.     /* Code Body                                                      */
  927.     /*----------------------------------------------------------------*/    
  928.     DisplayPopup(
  929.         (U8 *)GetString(msg_id),
  930.         IMG_GLOBAL_INFO,
  931.         1,
  932.         DATA_ACCOUNT_NOTIFY_TIMEOUT,
  933.         WARNING_TONE);
  934.     return;
  935. }
  936. /*****************************************************************************
  937.  * FUNCTION
  938.  *  mmi_wlan_provision_profile
  939.  * DESCRIPTION
  940.  *  This function setups a WLAN profile from a slim profile.
  941.  * PARAMETERS
  942.  *  dst             [OUT]           Destination profile
  943.  *  src             [IN]            Source slim profile
  944.  * RETURNS
  945.  *  void
  946.  *****************************************************************************/
  947. void mmi_wlan_provision_profile(
  948.         mmi_wlan_profile_struct *dst, 
  949.         const mmi_wlan_slim_profile_struct *src)
  950. {
  951.     /*----------------------------------------------------------------*/
  952.     /* Local Variables                                                */
  953.     /*----------------------------------------------------------------*/
  954.     
  955.     /*----------------------------------------------------------------*/
  956.     /* Code Body                                                      */
  957.     /*----------------------------------------------------------------*/
  958.     /* Clear the profile. */
  959.     mmi_wlan_init_profile(dst);
  960.     UCS2Strcpy((S8 *)dst->name, (S8 *)src->name);   /* Name             */
  961.     dst->ssid_len = src->ssid_len;                  /* SSID length      */
  962.     memcpy(dst->ssid, src->ssid, dst->ssid_len);    /* SSID             */
  963.     dst->network_type = src->network_type;          /* Network type     */
  964.     dst->encrypt_mode = src->encrypt_mode;          /* Encryption       */
  965.     dst->auth_mode    = src->auth_mode;             /* Authentication   */
  966.     /* WEP settings */
  967.     if (dst->auth_mode == WLAN_AUTH_MODE_SHARED || 
  968.         dst->encrypt_mode == WLAN_ENCRYPT_MODE_WEP)
  969.     {
  970.         dst->wep_key_index  = src->wep_key_index;
  971.         dst->wep_key_len    = src->wep_key_len;
  972.         dst->wep_key_format = src->wep_key_format;
  973.         strcpy((S8 *)dst->wep_key, (S8 *)src->wep_key);
  974.     }
  975.     /* Pre-shared key settings. */
  976.     if (dst->auth_mode == WLAN_AUTH_MODE_WPAPSK)
  977.     {
  978.         /* Default uses psk; otherwise, compute psk from passphrase. */
  979.         if (src->psk[32] != 0)
  980.         {
  981.             memcpy(dst->psk, src->psk, 32);
  982.         }
  983.         else
  984.         {
  985.             strcpy((S8 *)dst->passphrase, (S8 *)src->passphrase);
  986.             
  987.         #ifdef __MTK_TARGET__
  988.             pbkdf2_sha1(
  989.                 (S8 *)dst->passphrase,
  990.                 (S8 *)dst->ssid,
  991.                 dst->ssid_len,
  992.                 4096,
  993.                 dst->psk,
  994.                 32);
  995.         #else
  996.             memcpy(dst->psk, src->passphrase, 32);
  997.         #endif
  998.         }
  999.         /* PSK is always provided. Turn on the flag. */
  1000.         dst->psk[32] = 1;
  1001.     }
  1002.     /* EAP settings. */
  1003.     if (dst->auth_mode == WLAN_AUTH_MODE_IEEE8021X || 
  1004.         dst->auth_mode == WLAN_AUTH_MODE_WPA)
  1005.     {
  1006.         dst->auth_type1 = src->auth_type1;
  1007.         strcpy((S8 *)dst->username, (S8 *)src->username);
  1008.         strcpy((S8 *)dst->password, (S8 *)src->password);
  1009.     }
  1010. }
  1011. /*****************************************************************************
  1012.  * FUNCTION
  1013.  *  mmi_wlan_install_profiles
  1014.  * DESCRIPTION
  1015.  *  This function installs each incoming profile that has been chosen to 
  1016.  *  install.
  1017.  * PARAMETERS
  1018.  *  void
  1019.  * RETURNS
  1020.  *  Number of installed profiles.
  1021.  *****************************************************************************/
  1022. U8 mmi_wlan_install_profiles(void)
  1023. {
  1024.     /*----------------------------------------------------------------*/
  1025.     /* Local Variables                                                */
  1026.     /*----------------------------------------------------------------*/
  1027.     mmi_wlan_slim_profile_struct *src_prof;
  1028.     mmi_wlan_profile_struct *dst_prof;
  1029.     S16 src_idx;
  1030.     U8 data_acct_id, priority;
  1031.     S16 error;
  1032.     U8 num_installed;
  1033.     U8 i;
  1034.     
  1035.     /*----------------------------------------------------------------*/
  1036.     /* Code Body                                                      */
  1037.     /*----------------------------------------------------------------*/
  1038.     /* Delete screens associated with the last profile. Clear delete screen
  1039.        callback temporarily to prevent from terminating app. */
  1040.     ClearDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, NULL);
  1041.     GoBackToHistory(SCR_ID_CCA_PROGRESS);
  1042.     SetDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, mmi_wlan_abort_otap_app);
  1043.     /* Obtain the WLAN data account ID. */
  1044. #ifdef __MTK_TARGET__
  1045.     data_acct_id = mmi_dtcnt_get_first_account_id(DATA_ACCOUNT_BEARER_WIFI);
  1046. #else
  1047.     data_acct_id = 20;
  1048. #endif
  1049.     /* Install each profile. To make sure the order of installed profiles are
  1050.        correct, scan the slots, rather than profiles in the control block. */
  1051.     num_installed = 0;
  1052.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  1053.     {
  1054.         /* Continue when no incoming profile plans to install in this slot. */
  1055.         if ((src_idx = g_wlan_otap->src_idx[i]) < 0) 
  1056.         {
  1057.             continue;
  1058.         }
  1059.         src_prof = g_wlan_otap->profile[src_idx];
  1060.         dst_prof = &g_wlan_prof_list[i];
  1061.         /* Obtain priority. If it's to replace an existing profile, use 
  1062.            existing profile's priority. Otherwise, compute a new one. */
  1063.         if (dst_prof->ssid_len != 0) 
  1064.         {
  1065.             priority = dst_prof->priority;
  1066.         } 
  1067.         else 
  1068.         {
  1069.             priority = ++g_wlan_display_context.prof_num;
  1070.         }
  1071.         
  1072.         /* Setup profile. Note that all context of dst_prof will be reset. */
  1073.         mmi_wlan_provision_profile(dst_prof, src_prof);
  1074.         /* Setup new priority, profile_id and update pointer. */
  1075.         dst_prof->priority = priority;
  1076.         dst_prof->profile_id = ++g_wlan_setting_context.profile_id_count;
  1077.         
  1078.         g_wlan_profile[dst_prof->priority - 1] = dst_prof;
  1079.         /* Save profile in the NVRAM. */
  1080.         WriteRecord(NVRAM_EF_WLAN_PROFILE_LID, (U16)(i + 1), dst_prof, NVRAM_MAX_WLAN_PROFILE_SIZE, &error);
  1081.         if (error != NVRAM_WRITE_SUCCESS) 
  1082.         {
  1083.             MMI_ASSERT(0);
  1084.         }
  1085.         /* Notify CCA the success of installing each WLAN profile. */
  1086.         mmi_cca_oma_add_dataacctid(g_wlan_otap->doc_hdl, (S8 *)src_prof->node_id, data_acct_id);
  1087.         /* Install successfully. Update counter. */        
  1088.         ++num_installed;
  1089.     }
  1090.     /* profile_id_count has been updated. Save the context in the NVRAM. */
  1091.     WriteRecord(NVRAM_EF_WLAN_SETTING_LID, 1, &g_wlan_setting_context, NVRAM_MAX_WLAN_SETTING_SIZE, &error);
  1092.     if (error != NVRAM_WRITE_SUCCESS) 
  1093.     {
  1094.         MMI_ASSERT(0);
  1095.     }
  1096.     return num_installed;
  1097. }
  1098. /*****************************************************************************
  1099.  * FUNCTION
  1100.  *  mmi_wlan_auto_rename_profile
  1101.  * DESCRIPTION
  1102.  *  This function renames the specified provisioned profile that has duplicate
  1103.  *  name.
  1104.  * PARAMETERS
  1105.  *  src_idx         [IN]            Used to specified the profile
  1106.  * RETURNS
  1107.  *  void
  1108.  *****************************************************************************/
  1109. void mmi_wlan_auto_rename_profile(S16 src_idx)
  1110. {
  1111.     /*----------------------------------------------------------------*/
  1112.     /* Local Variables                                                */
  1113.     /*----------------------------------------------------------------*/
  1114.     const U8 *name[MAX_WLAN_DATA_ACCOUNT_NUM];
  1115.     U8 num_names;
  1116.     S16 dst_idx, i_src_idx;
  1117.     U8 i;
  1118.     
  1119.     /*----------------------------------------------------------------*/
  1120.     /* Code Body                                                      */
  1121.     /*----------------------------------------------------------------*/
  1122.     /* Inform user the auto renaming. */
  1123.     /* mmi_wlan_show_info(STR_ID_DTCNT_WLAN_AUTO_RENAME_PROFILE); */
  1124.     /* Collect the other profiles' names. */
  1125.     num_names = 0;
  1126.     dst_idx = g_wlan_otap->dst_idx[src_idx];
  1127.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  1128.     {
  1129.         /* Skip itself. */
  1130.         if (dst_idx == i) 
  1131.         {
  1132.             continue;
  1133.         }
  1134.         /* Obtain the name of the profile in the i-th slot at present. */
  1135.         i_src_idx = g_wlan_otap->src_idx[i];
  1136.         if (i_src_idx >= 0)
  1137.         {
  1138.             /* i-th slot has been selected to install an incoming profile. */
  1139.             name[num_names++] = g_wlan_otap->profile[i_src_idx]->name;
  1140.         }
  1141.         else if (g_wlan_prof_list[i].ssid_len != 0)
  1142.         {
  1143.             /* A profile exists in i-th slot before OTA provisioning. */
  1144.             name[num_names++] = g_wlan_prof_list[i].name;
  1145.         }
  1146.     }
  1147.     /* Auto renaming. */
  1148.     mmi_wlan_resolve_duplicate_name(g_wlan_otap->profile[src_idx]->name, name, num_names);
  1149. }
  1150. /*****************************************************************************
  1151.  * FUNCTION
  1152.  *  mmi_wlan_is_duplicate_name
  1153.  * DESCRIPTION
  1154.  *  This function examines whether the specified provisioning profile has a 
  1155.  *  duplicate name.
  1156.  * PARAMETERS
  1157.  *  src_idx         [IN]            Used to specify the profile
  1158.  * RETURNS
  1159.  *  When there is a duplication, return TRUE. Otherwise, return FALSE.
  1160.  *****************************************************************************/
  1161. MMI_BOOL mmi_wlan_is_duplicate_name(S16 src_idx)
  1162. {
  1163.     /*----------------------------------------------------------------*/
  1164.     /* Local Variables                                                */
  1165.     /*----------------------------------------------------------------*/
  1166.     U8 *name;
  1167.     S16 dst_idx, i_src_idx;
  1168.     U8 i;
  1169.     
  1170.     /*----------------------------------------------------------------*/
  1171.     /* Code Body                                                      */
  1172.     /*----------------------------------------------------------------*/
  1173.     /* Obtain info about this specified provisioned profile. */
  1174.     name    = g_wlan_otap->profile[src_idx]->name;
  1175.     dst_idx = g_wlan_otap->dst_idx[src_idx];
  1176.     /* Check duplication by scanning all profiles. */
  1177.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  1178.     {
  1179.         /* Skip itself. */
  1180.         if (dst_idx == i) 
  1181.         {
  1182.             continue;
  1183.         }
  1184.         /* Obtain the name of the profile in the i-th slot at present. */
  1185.         i_src_idx = g_wlan_otap->src_idx[i];
  1186.         if (i_src_idx >= 0)
  1187.         {
  1188.             /* i-th slot has been selected to install a incoming profile. */
  1189.             if (UCS2Strcmp((S8 *)name, (S8 *)g_wlan_otap->profile[i_src_idx]->name) == 0) 
  1190.             {
  1191.                 return MMI_TRUE;
  1192.             }
  1193.         }
  1194.         else if (g_wlan_prof_list[i].ssid_len != 0)
  1195.         {
  1196.             /* A profile exists in i-th slot before OTA provisioning. */
  1197.             if (UCS2Strcmp((S8 *)name, (S8 *)g_wlan_prof_list[i].name) == 0) 
  1198.             {
  1199.                 return MMI_TRUE;
  1200.             }
  1201.         }
  1202.     }
  1203.     return MMI_FALSE;
  1204. }
  1205. /*****************************************************************************
  1206.  * FUNCTION
  1207.  *  mmi_wlan_replacement_save
  1208.  * DESCRIPTION
  1209.  *  This function saves the information to replace an existing profile with
  1210.  *  the current provisioned one.
  1211.  * PARAMETERS
  1212.  *  void
  1213.  * RETURNS
  1214.  *  void
  1215.  *****************************************************************************/
  1216. void mmi_wlan_replacement_save(void)
  1217. {
  1218.     /*----------------------------------------------------------------*/
  1219.     /* Local Variables                                                */
  1220.     /*----------------------------------------------------------------*/
  1221.     S16 src_idx, dst_idx;
  1222.     
  1223.     /*----------------------------------------------------------------*/
  1224.     /* Code Body                                                      */
  1225.     /*----------------------------------------------------------------*/
  1226.     /* The index of profile in profile list that plans to be replaced. */
  1227.     dst_idx = g_wlan_otap->sel_dst_idx[g_wlan_otap->choice];
  1228.     /* Whether the profile has been selected to be replaced during OTA
  1229.        provisioning. If yes, the previously provisioned profile is replaced
  1230.        here and will not be install consequently. */
  1231.     src_idx = g_wlan_otap->src_idx[dst_idx];
  1232.     
  1233.     if (src_idx >= 0) 
  1234.     {
  1235.         g_wlan_otap->dst_idx[src_idx] = -1;
  1236.     }
  1237.     
  1238.     /* Save the replacement result. */
  1239.     g_wlan_otap->src_idx[dst_idx]           = g_wlan_otap->iter;
  1240.     g_wlan_otap->dst_idx[g_wlan_otap->iter] = dst_idx;
  1241.     /* Whether the profile's name is duplicate. */
  1242.     if (mmi_wlan_is_duplicate_name(g_wlan_otap->iter) == MMI_TRUE) 
  1243.     {
  1244.         mmi_wlan_auto_rename_profile(g_wlan_otap->iter);
  1245.     }
  1246.     /* Go to next profile if it is presented. */
  1247.     mmi_wlan_next_profile();
  1248. }
  1249. /*****************************************************************************
  1250.  * FUNCTION
  1251.  *  mmi_wlan_entry_replacement_confirm
  1252.  * DESCRIPTION
  1253.  *  This function shows a confirmation screen to confirm a replacement.
  1254.  * PARAMETERS
  1255.  *  void
  1256.  * RETURNS
  1257.  *  void
  1258.  *****************************************************************************/
  1259. void mmi_wlan_entry_replacement_confirm(void)
  1260. {
  1261.     /*----------------------------------------------------------------*/
  1262.     /* Local Variables                                                */
  1263.     /*----------------------------------------------------------------*/
  1264.     /*----------------------------------------------------------------*/
  1265.     /* Code Body                                                      */
  1266.     /*----------------------------------------------------------------*/
  1267.     /* The profile is in use. Can't be replaced. */
  1268.     if (g_wlan_otap->choice == g_wlan_otap->in_use)
  1269.     {
  1270.         mmi_wlan_show_info(STR_ID_DTCNT_WLAN_ERROR_PROFILE_IN_USE);
  1271.         return;
  1272.     }
  1273.     /* Now, confirm the replacement with the user. */
  1274.     DisplayConfirm(
  1275.         STR_GLOBAL_YES,
  1276.         IMG_GLOBAL_YES,
  1277.         STR_GLOBAL_NO,
  1278.         IMG_GLOBAL_NO,
  1279.         get_string(STR_ID_DTCNT_WLAN_REPLACE_CONFIRM),
  1280.         IMG_GLOBAL_QUESTION,
  1281.         WARNING_TONE);
  1282.     SetLeftSoftkeyFunction(mmi_wlan_replacement_save, KEY_EVENT_UP);
  1283.     SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);
  1284. }
  1285. /*****************************************************************************
  1286.  * FUNCTION
  1287.  *  mmi_wlan_replacement_highlight_hdlr
  1288.  * DESCRIPTION
  1289.  *  This highlight handler remembers the item chosen to be replaced.
  1290.  * PARAMETERS
  1291.  *  void
  1292.  * RETURNS
  1293.  *  void
  1294.  *****************************************************************************/
  1295. void mmi_wlan_replacement_highlight_hdlr(S32 index)
  1296. {
  1297.     /*----------------------------------------------------------------*/
  1298.     /* Local Variables                                                */
  1299.     /*----------------------------------------------------------------*/
  1300.     /*----------------------------------------------------------------*/
  1301.     /* Code Body                                                      */
  1302.     /*----------------------------------------------------------------*/
  1303.     g_wlan_otap->choice = index;
  1304. }
  1305. /*****************************************************************************
  1306.  * FUNCTION
  1307.  *  mmi_wlan_entry_replacement
  1308.  * DESCRIPTION
  1309.  *  This function shows all WLAN profiles installed on the system such that 
  1310.  *  users can select an existing profile to be replaced.
  1311.  * PARAMETERS
  1312.  *  void
  1313.  * RETURNS
  1314.  *  void
  1315.  *****************************************************************************/
  1316. void mmi_wlan_entry_replacement(void)
  1317. {
  1318.     /*----------------------------------------------------------------*/
  1319.     /* Local Variables                                                */
  1320.     /*----------------------------------------------------------------*/
  1321.     U8 *prof_name[MAX_WLAN_DATA_ACCOUNT_NUM];
  1322.     S16 sel_idx, i_src_idx;
  1323.     U8 *gui_buffer;
  1324.     U8 count;
  1325.     U8 i;
  1326.     /*----------------------------------------------------------------*/
  1327.     /* Code Body                                                      */
  1328.     /*----------------------------------------------------------------*/    
  1329.     /* Initialize an invalid used index of an existing profile. */
  1330.     g_wlan_otap->in_use = -1;
  1331.     
  1332.     /* Obtain the list of profiles that can be replaced. */
  1333.     count = 0;
  1334.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  1335.     {
  1336.         if (g_wlan_prof_list[i].ssid_len == 0)
  1337.         {
  1338.             /* The slot is originally empty, but has been chosen to install
  1339.                incoming profile during OTA provisioning. */
  1340.             i_src_idx = g_wlan_otap->src_idx[i];
  1341.             sel_idx   = g_wlan_display_context.prof_num + (count++);
  1342.             prof_name[sel_idx] = g_wlan_otap->profile[i_src_idx]->name;
  1343.             g_wlan_otap->sel_dst_idx[sel_idx] = i;
  1344.         }
  1345.         else
  1346.         {
  1347.             /* The profile is originally used. */
  1348.             i_src_idx = g_wlan_otap->src_idx[i];
  1349.             sel_idx   = g_wlan_prof_list[i].priority - 1;
  1350.             /* Whether the slot has been chosen to install incoming profiles. */
  1351.             if (i_src_idx >= 0) 
  1352.             {
  1353.                 prof_name[sel_idx] = g_wlan_otap->profile[i_src_idx]->name;
  1354.             } 
  1355.             else 
  1356.             {
  1357.                 prof_name[sel_idx] = g_wlan_prof_list[i].name;
  1358.             }
  1359.             g_wlan_otap->sel_dst_idx[sel_idx] = i;
  1360.             /* The profile is in use. Can't be replaced. Remember the index. */
  1361.             if (&g_wlan_prof_list[i] == g_wlan_display_context.connected_wlan_profile) 
  1362.             {
  1363.                 g_wlan_otap->in_use = sel_idx;
  1364.             }
  1365.         }
  1366.     }
  1367.     
  1368.     /* prof_num + count MUST be max number of profiles. */
  1369.     MMI_ASSERT((g_wlan_display_context.prof_num + count) == MAX_WLAN_DATA_ACCOUNT_NUM);
  1370.     
  1371.     /* 
  1372.      * Entry screen.
  1373.      */
  1374.     EntryNewScreen(SCR_ID_DTCNT_WLAN_REPLACE_PROFILE, NULL, mmi_wlan_entry_replacement, NULL);
  1375.     gui_buffer = GetCurrGuiBuffer(SCR_ID_DTCNT_WLAN_REPLACE_PROFILE);
  1376.     RegisterHighlightHandler(mmi_wlan_replacement_highlight_hdlr);
  1377.     /* TODO: gIndexIconsImageList only has numeric icons from 1 to 30. */
  1378.     ShowCategory53Screen(
  1379.         STR_ID_DTCNT_WLAN_REPLACE_PROFILE,
  1380.         GetRootTitleIcon(MENU_ID_WLAN_MAIN),
  1381.         STR_GLOBAL_OK,
  1382.         IMG_GLOBAL_OK,
  1383.         STR_GLOBAL_BACK,
  1384.         IMG_GLOBAL_BACK,
  1385.         MAX_WLAN_DATA_ACCOUNT_NUM,
  1386.         prof_name,
  1387.         (U16 *)gIndexIconsImageList,
  1388.         NULL,
  1389.         0,
  1390.         0,
  1391.         gui_buffer);
  1392.     SetLeftSoftkeyFunction(mmi_wlan_entry_replacement_confirm, KEY_EVENT_UP);
  1393.     SetKeyHandler(mmi_wlan_entry_replacement_confirm, KEY_RIGHT_ARROW, KEY_EVENT_DOWN);
  1394.     SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);
  1395.     SetKeyHandler(GoBackHistory, KEY_LEFT_ARROW, KEY_EVENT_DOWN);
  1396. }
  1397. /*****************************************************************************
  1398.  * FUNCTION
  1399.  *  mmi_wlan_is_empty_profile
  1400.  * DESCRIPTION
  1401.  *  This function examines whether the i-th slot in the profile list is used.
  1402.  * PARAMETERS
  1403.  *  i               [IN]            Used to specify i-th profile
  1404.  * RETURNS
  1405.  *  Return TRUE when profile is empty. Otherwise, return FALSE.
  1406.  *****************************************************************************/
  1407. MMI_BOOL mmi_wlan_is_empty_profile(U8 i)
  1408. {
  1409.     /*----------------------------------------------------------------*/
  1410.     /* Local Variables                                                */
  1411.     /*----------------------------------------------------------------*/
  1412.     
  1413.     /*----------------------------------------------------------------*/
  1414.     /* Code Body                                                      */
  1415.     /*----------------------------------------------------------------*/
  1416.     /* The profile is used originally. */
  1417.     if (g_wlan_prof_list[i].ssid_len != 0) 
  1418.     {
  1419.         return MMI_FALSE;
  1420.     }
  1421.     /* The profile is selected during the OTA provisioning. */
  1422.     if (g_wlan_otap->src_idx[i] >= 0) 
  1423.     {
  1424.         return MMI_FALSE;
  1425.     }
  1426.     
  1427.     return MMI_TRUE;
  1428. }
  1429. /*****************************************************************************
  1430.  * FUNCTION
  1431.  *  mmi_wlan_next_profile
  1432.  * DESCRIPTION
  1433.  *  This function leads us to process next incoming profile.
  1434.  * PARAMETERS
  1435.  *  void
  1436.  * RETURNS
  1437.  *  void
  1438.  *****************************************************************************/
  1439. void mmi_wlan_next_profile(void)
  1440. {
  1441.     /*----------------------------------------------------------------*/
  1442.     /* Local Variables                                                */
  1443.     /*----------------------------------------------------------------*/
  1444.     U8 num_installed;
  1445.     
  1446.     /*----------------------------------------------------------------*/
  1447.     /* Code Body                                                      */
  1448.     /*----------------------------------------------------------------*/
  1449.     /* Increase the index of the iterator to process next profile. */
  1450.     ++g_wlan_otap->iter;
  1451.     /* Whether there is another profile needed to be installed. */
  1452.     if (g_wlan_otap->iter < g_wlan_otap->num_profiles) 
  1453.     {
  1454.         /* Try to install next profile. */
  1455.         mmi_wlan_entry_installation();
  1456.     } 
  1457.     else 
  1458.     {
  1459.         /* Now, save the profiles in the NVRAM. */
  1460.         num_installed = mmi_wlan_install_profiles();
  1461.         /* Send a response back to CCA and free memory. */    
  1462.         if (num_installed == 0) 
  1463.         {
  1464.             mmi_wlan_send_cca_app_configure_rsp(g_wlan_otap->conf_id, g_wlan_otap->doc_hdl, CCA_STATUS_SETTING_SKIPPED);
  1465.         } 
  1466.         else 
  1467.         {
  1468.             mmi_wlan_send_cca_app_configure_rsp(g_wlan_otap->conf_id, g_wlan_otap->doc_hdl, CCA_STATUS_OK);
  1469.         }
  1470.         /* Free all allocated memory. */
  1471.         mmi_wlan_free_otap_cntx();
  1472.         /* Clear the delete screen callback. */
  1473.         ClearDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, NULL);
  1474.     }
  1475. }
  1476. /*****************************************************************************
  1477.  * FUNCTION
  1478.  *  mmi_wlan_find_empty_profile
  1479.  * DESCRIPTION
  1480.  *  This function finds and remembers an empty profile. If there is no empty
  1481.  *  profile, entry replacement process.
  1482.  * PARAMETERS
  1483.  *  void
  1484.  * RETURNS
  1485.  *  voids
  1486.  *****************************************************************************/
  1487. void mmi_wlan_find_empty_profile(void)
  1488. {
  1489.     /*----------------------------------------------------------------*/
  1490.     /* Local Variables                                                */
  1491.     /*----------------------------------------------------------------*/
  1492.     U8 i;
  1493.     
  1494.     /*----------------------------------------------------------------*/
  1495.     /* Code Body                                                      */
  1496.     /*----------------------------------------------------------------*/
  1497.     /* Find an empty profile. */
  1498.     for (i = 0; i < MAX_WLAN_DATA_ACCOUNT_NUM; ++i)
  1499.     {
  1500.         /* Whether the profile is empty. */
  1501.         if (mmi_wlan_is_empty_profile(i) == MMI_TRUE) 
  1502.         {
  1503.             /* Remember the index of the empty profile. */
  1504.             g_wlan_otap->dst_idx[g_wlan_otap->iter] = i;
  1505.             g_wlan_otap->src_idx[i] = g_wlan_otap->iter;
  1506.             /* Whether the profile's name is duplicate. */
  1507.             if (mmi_wlan_is_duplicate_name(g_wlan_otap->iter) == MMI_TRUE) 
  1508.             {
  1509.                 mmi_wlan_auto_rename_profile(g_wlan_otap->iter);
  1510.             }
  1511.             
  1512.             /* Go to the next profile if it is presented. */
  1513.             mmi_wlan_next_profile();
  1514.             
  1515.             return;
  1516.         }
  1517.     }
  1518.     /* Can not find a empty profile. Enter profile replacement. */
  1519.     mmi_wlan_entry_replacement();
  1520. }
  1521. /*****************************************************************************
  1522.  * FUNCTION
  1523.  *  mmi_wlan_entry_installation
  1524.  * DESCRIPTION
  1525.  *  This function shows information about a incoming profile. And ask users
  1526.  *  whether they want to install the profile.
  1527.  * PARAMETERS
  1528.  *  void
  1529.  * RETURNS
  1530.  *  void
  1531.  *****************************************************************************/
  1532. void mmi_wlan_entry_installation(void)
  1533. {
  1534.     /*----------------------------------------------------------------*/
  1535.     /* Local Variables                                                */
  1536.     /*----------------------------------------------------------------*/
  1537.     mmi_wlan_slim_profile_struct *prof;
  1538.     S8 *info;
  1539.     U8 *gui_buffer;
  1540.     /*----------------------------------------------------------------*/
  1541.     /* Code Body                                                      */
  1542.     /*----------------------------------------------------------------*/
  1543.     /* Obtain the current interesting profile. */
  1544.     prof = (mmi_wlan_slim_profile_struct *)g_wlan_otap->profile[g_wlan_otap->iter];
  1545.     /* Obtain a temporary buffer to show messages. */
  1546.     info = (S8 *)subMenuData;
  1547.     /* Profile name */
  1548.     UCS2Strcpy(info, GetString(STR_ID_DTCNT_WLAN_NAME));
  1549.     UCS2Strcat(info, (S8 *)L":  ");
  1550.     UCS2Strcat(info, (S8 *)prof->name);
  1551.     UCS2Strcat(info, (S8 *)L"nn");
  1552.     
  1553.     /* SSID */
  1554.     UCS2Strcat(info, GetString(STR_ID_DTCNT_WLAN_SSID));
  1555.     UCS2Strcat(info, (S8 *)L":  ");
  1556.     AnsiiToUnicodeString(info + UCS2Strlen(info) * ENCODING_LENGTH, (S8 *)prof->ssid);
  1557.     UCS2Strcat(info, (S8 *)L"nn");
  1558.     
  1559.     /* Network type */
  1560.     UCS2Strcat(info, GetString(STR_ID_DTCNT_WLAN_NETWORK_TYPE));
  1561.     UCS2Strcat(info, (S8 *)L":  ");
  1562.     switch (prof->network_type)
  1563.     {
  1564.         case WLAN_NETWORK_TYPE_ADHOC:
  1565.             UCS2Strcat(info, GetString(STR_ID_DTCNT_WLAN_NETWORK_TYPE_ADHOC));
  1566.             break;
  1567.         case WLAN_NETWORK_TYPE_INFRA:
  1568.             UCS2Strcat(info, GetString(STR_ID_DTCNT_WLAN_NETWORK_TYPE_INFRA));
  1569.             break;
  1570.         default:
  1571.             MMI_ASSERT(0);  /* Impossible to reach here. */
  1572.     }
  1573.     UCS2Strcat(info, (S8 *)L"nn");
  1574.     /* 
  1575.      * Security solution 
  1576.      */    
  1577.     UCS2Strcat(info, GetString(STR_ID_DTCNT_WLAN_SECURITY));
  1578.     UCS2Strcat(info, (S8 *)L":  ");
  1579.     switch (prof->auth_mode)
  1580.     {
  1581.         case WLAN_AUTH_MODE_OPEN:
  1582.             if (prof->encrypt_mode == WLAN_ENCRYPT_MODE_WEP) 
  1583.             {
  1584.                 UCS2Strcat(info, (S8 *)L"WEPnn");
  1585.             } 
  1586.             else 
  1587.             {
  1588.                 UCS2Strcat(info, (S8 *)L"OPENnn");
  1589.             }
  1590.             break;
  1591.         case WLAN_AUTH_MODE_SHARED:
  1592.             
  1593.             UCS2Strcat(info, (S8 *)L"WEPnn");
  1594.             break;
  1595.             
  1596.         case WLAN_AUTH_MODE_IEEE8021X:
  1597.             
  1598.             UCS2Strcat(info, (S8 *)L"IEEE802.1Xnn");
  1599.             break;
  1600.         case WLAN_AUTH_MODE_WPA:
  1601.             switch (prof->encrypt_mode) 
  1602.             {
  1603.                 case WLAN_ENCRYPT_MODE_TKIP:
  1604.                     UCS2Strcat(info, (S8 *)L"WPAnn");
  1605.                     break;
  1606.             
  1607.                 case WLAN_ENCRYPT_MODE_AES:
  1608.                     UCS2Strcat(info, (S8 *)L"WPA2nn");
  1609.                     break;
  1610.             
  1611.                 default:
  1612.                     MMI_ASSERT(0);  /* Impossible to reach here. */
  1613.             }
  1614.             break;
  1615.             
  1616.         case WLAN_AUTH_MODE_WPAPSK:
  1617.             if (prof->network_type == WLAN_NETWORK_TYPE_ADHOC)
  1618.             {
  1619.                 /* No matter the encryption method is TKIP or AES, this is 
  1620.                    callled WPA-NONE for ad-hoc network. */
  1621.                 UCS2Strcat(info, (S8 *)L"WPA-NONEnn");
  1622.             }
  1623.             else
  1624.             {
  1625.                 /* For infrastructure mode, determine it by the encryption. */
  1626.                 switch (prof->encrypt_mode) 
  1627.                 {
  1628.                     case WLAN_ENCRYPT_MODE_TKIP:
  1629.                         UCS2Strcat(info, (S8 *)L"WPA-PSKnn");
  1630.                         break;
  1631.                 
  1632.                     case WLAN_ENCRYPT_MODE_AES:
  1633.                         UCS2Strcat(info, (S8 *)L"WPA2-PSKnn");
  1634.                         break;
  1635.                 
  1636.                     default:
  1637.                         MMI_ASSERT(0);  /* Impossible to reach here. */
  1638.                 }
  1639.             }
  1640.             
  1641.             break;
  1642.         default:
  1643.             /* After profile validation, it's impossible to reach here. */
  1644.             MMI_ASSERT(0);
  1645.     }
  1646.     
  1647.     /* 
  1648.      * Entry screen. 
  1649.      */
  1650.     EntryNewScreen(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, NULL, mmi_wlan_entry_installation, NULL);
  1651.     gui_buffer = GetCurrGuiBuffer(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE);
  1652.     ShowCategory74Screen(
  1653.         STR_ID_DTCNT_WLAN_INSTALL_PROFILE,
  1654.         GetRootTitleIcon(MENU_ID_WLAN_MAIN),
  1655.         STR_GLOBAL_YES,
  1656.         IMG_GLOBAL_YES,
  1657.         STR_GLOBAL_NO,
  1658.         IMG_GLOBAL_NO,
  1659.         (U8 *)info,
  1660.         MAX_SUB_MENUS * MAX_SUB_MENU_SIZE,
  1661.         gui_buffer);
  1662.     SetLeftSoftkeyFunction(mmi_wlan_find_empty_profile, KEY_EVENT_UP);
  1663.     SetRightSoftkeyFunction(mmi_wlan_next_profile, KEY_EVENT_UP);
  1664.     /* 
  1665.     SetKeyHandler(mmi_wlan_find_empty_profile, KEY_RIGHT_ARROW, KEY_EVENT_DOWN);
  1666.     SetKeyHandler(mmi_wlan_next_profile, KEY_LEFT_ARROW, KEY_EVENT_DOWN); 
  1667.     */
  1668.     /* Delete screens associated with previous profile. Clear delete screen 
  1669.        callback temporarily to prevent from terminating app. */
  1670.     ClearDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, NULL);
  1671.     DeleteScreenIfPresent(SCR_ID_DTCNT_WLAN_REPLACE_PROFILE);
  1672.     DeleteScreenIfPresent(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE);
  1673.     SetDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, mmi_wlan_abort_otap_app);
  1674. }
  1675. /*****************************************************************************
  1676.  * Use OMA extension OTAP spec.
  1677.  *****************************************************************************/
  1678. #if defined(__MMI_WLAN_OTAP_OMAEXT__)
  1679. static U32 mmi_wlan_base64_decoder(S8 *dst, U32 dst_size, const S8 *src, U32 src_size);
  1680. static MMI_BOOL mmi_wlan_has_otap_profile(cca_iterator_struct *param_list);
  1681. static cca_status_enum mmi_wlan_proc_cca_param_wepkey(
  1682.                         const cca_core_data_struct *param, 
  1683.                         mmi_wlan_slim_profile_struct *prof);
  1684. static cca_status_enum mmi_wlan_proc_cca_param_eap(
  1685.                         const cca_core_data_struct *param, 
  1686.                         mmi_wlan_slim_profile_struct *prof);
  1687. static cca_status_enum mmi_wlan_proc_cca_param_wlan(
  1688.                         const cca_core_data_struct *param, 
  1689.                         mmi_wlan_slim_profile_struct *prof);
  1690. static cca_status_enum mmi_wlan_proc_cca_param_napdef(
  1691.                         const cca_core_data_struct *param, 
  1692.                         mmi_wlan_otap_struct *cntx);
  1693. static cca_status_enum mmi_wlan_proc_cca_nodes(
  1694.                         S32 doc_hdl, 
  1695.                         S32 node_hdl, 
  1696.                         U16 symbol, 
  1697.                         cca_iterator_struct *param_list, 
  1698.                         void *user_data);
  1699. /*****************************************************************************
  1700.  * FUNCTION
  1701.  *  mmi_wlan_base64_decoder
  1702.  * DESCRIPTION
  1703.  *  This function decodes the Base64 encoded data according to the RFC 1341.
  1704.  * PARAMETERS
  1705.  *  dst             [OUT]           Buffer for storing the decoded data
  1706.  *  dst_size        [IN]            Size of the dst buffer
  1707.  *  src             [IN]            Buffer of the input Base64 encoded data
  1708.  *  src_size        [IN]            #characters of the Base64 encoded data
  1709.  * RETURNS
  1710.  *  On success, it returns the number of decoded octets that are stored in the
  1711.  *  dst buffer. On error, 0 is returned, e.g., when the size of dst buffer is
  1712.  *  too small. 
  1713.  *****************************************************************************/
  1714. U32 mmi_wlan_base64_decoder(S8 *dst, U32 dst_size, const S8 *src, U32 src_size)
  1715. {
  1716.     /*----------------------------------------------------------------*/
  1717.     /* Local Variables                                                */
  1718.     /*----------------------------------------------------------------*/
  1719.     /*
  1720.      * Codebook used to decode Base64 data. Please refer to RFC 1341 and ASCII
  1721.      * encoding for more details.
  1722.      */
  1723.     const U8 codebook[] = 
  1724.     {
  1725.         62, 0xFF, 0xFF, 0xFF, 63,                       /* +, /     */
  1726.         52, 53, 54, 55, 56, 57, 58, 59, 60, 61,         /* 0-9      */
  1727.         0xFF, 0xFF, 0xFF, 0, 0xFF, 0xFF, 0xFF,          /* =        */
  1728.         0, 1, 2, 3, 4, 5, 6, 7, 8, 9,                   /* A-Z      */
  1729.         10, 11, 12, 13, 14, 15, 16, 17,
  1730.         18, 19, 20, 21, 22, 23, 24, 25,
  1731.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,             /* garbage  */
  1732.         26, 27, 28, 29, 30, 31, 32, 33, 34, 35,         /* a-z      */
  1733.         36, 37, 38, 39, 40, 41, 42, 43,
  1734.         44, 45, 46, 47, 48, 49, 50, 51
  1735.     };
  1736.     U8 in[4], out[3];               /* buffers to decode a quantum  */
  1737.     S8 count;                       /* #octet decoded for a quantum */
  1738.     U32 num_octets;                 /* #octet decoded from source   */
  1739.     U32 i, j;
  1740.     /*----------------------------------------------------------------*/
  1741.     /* Code Body                                                      */
  1742.     /*----------------------------------------------------------------*/
  1743.     /* Initialize the number of octets decoded from the Base64 data. */
  1744.     num_octets = 0;
  1745.     /* Start the Base64 decoding process. */
  1746.     for (i = 0; i < src_size;) 
  1747.     {
  1748.         /* Initialize #octet decoded for a quantum without padding. */
  1749.         count = 3;
  1750.         /* Obtain a quantum to be decoded. */
  1751.         for (j = 0; j < 4; ++j) 
  1752.         {
  1753.             /* Ignore line breaks and other characters not found in the
  1754.                table of Base64 specification. */
  1755.             do 
  1756.             {
  1757.                 /* Read one character from the Base64 data. If the data steam 
  1758.                    is empty, assign the padding character '='. */
  1759.                 if (i < src_size) 
  1760.                 {
  1761.                     in[j] = src[i++];
  1762.                 } 
  1763.                 else 
  1764.                 {
  1765.                     in[j] = '=';
  1766.                 }
  1767.                 /* Padding happened. Decrease count for the decoded result.
  1768.                    Note that count might be negative when there is nothing to
  1769.                    commit to the destination buffer. */
  1770.                 if (in[j] == '=') 
  1771.                 {
  1772.                     --count;
  1773.                 }
  1774.                 /* decode the character by table look-up. */
  1775.                 if (in[j] >= '+' && in[j] <= 'z') 
  1776.                 {
  1777.                     in[j] = codebook[in[j] - '+'];
  1778.                 } 
  1779.                 else 
  1780.                 {
  1781.                     in[j] = 0xFF;
  1782.                 }
  1783.             } while (in[j] == 0xFF);
  1784.         }
  1785.         /* decode the quantum. */
  1786.         out[0] = (U8)(in[0] << 2 | in[1] >> 4);
  1787.         out[1] = (U8)(in[1] << 4 | in[2] >> 2);
  1788.         out[2] = (U8)(in[2] << 6 | in[3]);
  1789.         /* commit the result when we have decoded octets actually. */
  1790.         if (count > 0) 
  1791.         {
  1792.             /* check whether the size of the dst buffer is enough. */
  1793.             if (num_octets + count > dst_size || UINT_MAX - count < num_octets) 
  1794.             {
  1795.                 return 0;
  1796.             }
  1797.             /* commit the result to the destination buffer. */
  1798.             memcpy(dst + num_octets, out, count);
  1799.             num_octets += count;
  1800.         }
  1801.     }
  1802.     return num_octets;
  1803. }
  1804. /*****************************************************************************
  1805.  * FUNCTION
  1806.  *  mmi_wlan_has_otap_profile
  1807.  * DESCRIPTION
  1808.  *  This function checks whether there is a new WLAN profile in the document.
  1809.  *  The input data list contains the parameters and their values of a NAPDEF
  1810.  *  node. Care should be take that the input iterator is reset after calling
  1811.  *  the function.
  1812.  * PARAMETERS
  1813.  *  param_list       [IN]           Parameter list for a NAPDEF node
  1814.  * RETURNS
  1815.  *  If there is a new WLAN profile, return TRUE. Otherwise, return FALSE.
  1816.  *****************************************************************************/
  1817. MMI_BOOL mmi_wlan_has_otap_profile(cca_iterator_struct *param_list)
  1818. {
  1819.     /*----------------------------------------------------------------*/
  1820.     /* Local Variables                                                */
  1821.     /*----------------------------------------------------------------*/
  1822.     S32 *bearer;
  1823.     S32 num_bearers;
  1824.     cca_status_enum status;
  1825.     
  1826.     /*----------------------------------------------------------------*/
  1827.     /* Code Body                                                      */
  1828.     /*----------------------------------------------------------------*/    
  1829.     /* Extract the value of the parameter BEARER. */
  1830.     status = mmi_cca_doc_get_nodedata_ints(param_list, CCA_NS_OMA_BEARER, &bearer, &num_bearers);
  1831.     mmi_cca_iterator_restart(param_list);
  1832.     if (status != CCA_STATUS_OK) 
  1833.     {
  1834.         return MMI_FALSE;
  1835.     }
  1836.     /* Whether there is a WLAN bearer. */ 
  1837.     while (--num_bearers >= 0)
  1838.     {
  1839.         if (bearer[num_bearers] == CCA_NS_VAL_WLAN) 
  1840.         {
  1841.             return MMI_TRUE;
  1842.         }
  1843.     }
  1844.     return MMI_FALSE;
  1845. }
  1846. /*****************************************************************************
  1847.  * FUNCTION
  1848.  *  mmi_wlan_proc_cca_param_wepkey
  1849.  * DESCRIPTION
  1850.  *  This function processes the parameter of WEPKEY node.
  1851.  * PARAMETERS
  1852.  *  param           [IN]            A parameter with its values
  1853.  *  prof            [IN/OUT]        The current provisioned profile
  1854.  * RETURNS
  1855.  *  On success, return OK; otherwise, return FAIL.
  1856.  *****************************************************************************/
  1857. cca_status_enum mmi_wlan_proc_cca_param_wepkey(
  1858.                     const cca_core_data_struct *param, 
  1859.                     mmi_wlan_slim_profile_struct *prof)
  1860. {
  1861.     /*----------------------------------------------------------------*/
  1862.     /* Local Variables                                                */
  1863.     /*----------------------------------------------------------------*/
  1864.     U32 num_octets;
  1865.     
  1866.     /*----------------------------------------------------------------*/
  1867.     /* Code Body                                                      */
  1868.     /*----------------------------------------------------------------*/
  1869.     /* 
  1870.      * Dispatching according to the parameter symbol 
  1871.      */
  1872.     switch (param->id)
  1873.     {
  1874.         case CCA_NS_OMA_LENGTH:
  1875.             
  1876.             /* Whether the value is presented and the type is legal. */
  1877.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  1878.             {
  1879.                 return CCA_STATUS_FAIL;
  1880.             }
  1881.             
  1882.             switch (atoi(param->values.s[0]))
  1883.             {
  1884.                 case 40:
  1885.                     /* 40-bits WEP key  +  24-bits IV  =  64 bits */
  1886.                     prof->wep_key_len = WLAN_WEP_KEY_ENCRYPT_64;
  1887.                     break;
  1888.                 case 104:
  1889.                     /* 104-bits WEP key  +  24-bits IV  =  128 bits */
  1890.                     prof->wep_key_len = WLAN_WEP_KEY_ENCRYPT_128;
  1891.                     break;
  1892.                 default:
  1893.                     return CCA_STATUS_FAIL;            
  1894.             }
  1895.             
  1896.             break;
  1897.         case CCA_NS_OMA_DATA:
  1898.             /* Whether the value is presented and the type is legal. */
  1899.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  1900.             {
  1901.                 return CCA_STATUS_FAIL;
  1902.             }
  1903.             /* Whether this is a ASCII string. */
  1904.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  1905.             {
  1906.                 return CCA_STATUS_FAIL;
  1907.             }
  1908.             /* Compute the WEP key. */
  1909.             num_octets = mmi_wlan_base64_decoder(
  1910.                             (S8 *)prof->wep_key, 
  1911.                             MAX_WEP_KEYSTR_LEN - 1, 
  1912.                             param->values.s[0], 
  1913.                             strlen(param->values.s[0]));
  1914.             /* Fail when wep_key buffer is too small, or length is illegal. */
  1915.             if (num_octets != 5 && num_octets != 13) 
  1916.             {
  1917.                 return CCA_STATUS_FAIL;
  1918.             }
  1919.             prof->wep_key[num_octets] = '';
  1920.             /* Set WEP key length when this entry is not set yet. */
  1921.             if (prof->wep_key_len == WLAN_WEP_KEY_ENCRYPT_TOTAL) 
  1922.             {
  1923.                 if (num_octets == 5) 
  1924.                 {
  1925.                     prof->wep_key_len = WLAN_WEP_KEY_ENCRYPT_64;
  1926.                 } 
  1927.                 else
  1928.                 {
  1929.                     prof->wep_key_len = WLAN_WEP_KEY_ENCRYPT_128;
  1930.                 }
  1931.             }
  1932.             
  1933.             break;
  1934.         case CCA_NS_OMA_INDEX:
  1935.         default:
  1936.             break;
  1937.     }
  1938.     
  1939.     return CCA_STATUS_OK;
  1940. }
  1941. /*****************************************************************************
  1942.  * FUNCTION
  1943.  *  mmi_wlan_proc_cca_param_eap
  1944.  * DESCRIPTION
  1945.  *  The function processes the parameter of EAP node.
  1946.  * PARAMETERS
  1947.  *  param           [IN]            A parameter with its values
  1948.  *  prof            [IN/OUT]        The current provisioned profile    
  1949.  * RETURNS
  1950.  *  On success, return OK; otherwise, return FAIL.
  1951.  *****************************************************************************/
  1952. cca_status_enum mmi_wlan_proc_cca_param_eap(
  1953.                     const cca_core_data_struct *param, 
  1954.                     mmi_wlan_slim_profile_struct *prof)
  1955. {
  1956.     /*----------------------------------------------------------------*/
  1957.     /* Local Variables                                                */
  1958.     /*----------------------------------------------------------------*/
  1959.     S32 str_len;
  1960.     
  1961.     /*----------------------------------------------------------------*/
  1962.     /* Code Body                                                      */
  1963.     /*----------------------------------------------------------------*/
  1964.     /* 
  1965.      * Dispatching according to the parameter symbol 
  1966.      */
  1967.     switch (param->id)
  1968.     {
  1969.         case CCA_NS_OMA_EAPTYPE:
  1970.             /* Whether the value is presented and the type is legal. */
  1971.             if (param->size <= 0 || param->type != CCA_DT_INT) 
  1972.             {
  1973.                 return CCA_STATUS_FAIL;
  1974.             }
  1975.             /* Only support EAP SIM currently. */
  1976.             switch (param->values.i[0])
  1977.             {
  1978.                 case CCA_NS_VAL_EAP_SIM:
  1979.                     prof->auth_type1 |= WLAN_EAP_SIM;
  1980.                     break;
  1981.                     
  1982.                 default:
  1983.                     return CCA_STATUS_FAIL;
  1984.             }
  1985.             
  1986.             break;
  1987.         case CCA_NS_OMA_USERNAME:
  1988.             /* Whether the value is presented and the type is legal. */
  1989.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  1990.             {
  1991.                 return CCA_STATUS_FAIL;
  1992.             }
  1993.             /* Check whether the length of the username is legal. */
  1994.             str_len = mmi_chset_utf8_strlen((kal_uint8 *)param->values.s[0]);
  1995.             if (str_len + 1 > MAX_USERNAME_LEN) 
  1996.             {
  1997.                 return CCA_STATUS_FAIL;
  1998.             }
  1999.             /* Whether this is a ASCII string. */
  2000.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  2001.             {
  2002.                 return CCA_STATUS_FAIL;
  2003.             }
  2004.             /* Obtain the username. Zero-terminate username. */
  2005.             strcpy((S8 *)prof->username, param->values.s[0]);        
  2006.             
  2007.             break;
  2008.         case CCA_NS_OMA_PASSWORD:
  2009.             
  2010.             /* Whether the value is presented and the type is legal. */
  2011.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2012.             {
  2013.                 return CCA_STATUS_FAIL;
  2014.             }
  2015.             /* Check whether the length of the password is legal. */
  2016.             str_len = mmi_chset_utf8_strlen((kal_uint8 *)param->values.s[0]);
  2017.             if (str_len + 1 > MAX_PASSWORD_LEN) 
  2018.             {
  2019.                 return CCA_STATUS_FAIL;
  2020.             }
  2021.             /* Whether this is a ASCII string. */
  2022.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  2023.             {
  2024.                 return CCA_STATUS_FAIL;
  2025.             }
  2026.             
  2027.             /* Obtain the password. Zero-terminate password. */
  2028.             strcpy((S8 *)prof->password, param->values.s[0]);            
  2029.             
  2030.             break;
  2031.         default:
  2032.             break;
  2033.     }
  2034.     return CCA_STATUS_OK;
  2035. }
  2036. /*****************************************************************************
  2037.  * FUNCTION
  2038.  *  mmi_wlan_proc_cca_param_wlan
  2039.  * DESCRIPTION
  2040.  *  This function processes the parameter of WLAN node.
  2041.  * PARAMETERS
  2042.  *  param           [IN]            A parameter with its values
  2043.  *  prof            [IN/OUT]        The current provisioned profile
  2044.  * RETURNS
  2045.  *  On success, return OK; otherwise, return FAIL.
  2046.  *****************************************************************************/
  2047. cca_status_enum mmi_wlan_proc_cca_param_wlan(
  2048.                     const cca_core_data_struct *param, 
  2049.                     mmi_wlan_slim_profile_struct *prof)
  2050. {
  2051.     /*----------------------------------------------------------------*/
  2052.     /* Local Variables                                                */
  2053.     /*----------------------------------------------------------------*/
  2054.     S32 str_len;
  2055.     U8 base64_buf[64];
  2056.     S32 value;
  2057.     
  2058.     /*----------------------------------------------------------------*/
  2059.     /* Code Body                                                      */
  2060.     /*----------------------------------------------------------------*/
  2061.     /* 
  2062.      * Dispatching according to the parameter symbol 
  2063.      */
  2064.     switch (param->id)
  2065.     {
  2066.         case CCA_NS_OMA_PRI_SSID:
  2067.             /* Whether the value is presented and the type is legal. */
  2068.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2069.             {
  2070.                 return CCA_STATUS_FAIL;
  2071.             }
  2072.             /* Whether the length of the SSID is legal. */
  2073.             str_len = mmi_chset_utf8_strlen((kal_uint8 *)param->values.s[0]);
  2074.             if (str_len + 1 > MAX_SSID_LEN) 
  2075.             {
  2076.                 return CCA_STATUS_FAIL;
  2077.             }
  2078.             /* Whether this is a ASCII string. */
  2079.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  2080.             {
  2081.                 return CCA_STATUS_FAIL;
  2082.             }
  2083.             
  2084.             /* Get SSID in ASCII format. Zero-terminate SSID. */
  2085.             prof->ssid_len = str_len;
  2086.             strcpy((S8 *)prof->ssid, param->values.s[0]);
  2087.             break;
  2088.         
  2089.         case CCA_NS_OMA_NETMODE:
  2090.             /* Whether the value is presented and the type is legal. */
  2091.             if (param->size <= 0 || param->type != CCA_DT_INT) 
  2092.             {
  2093.                 return CCA_STATUS_FAIL;
  2094.             }
  2095.             /* Extract setting. */
  2096.             switch (param->values.i[0])
  2097.             {
  2098.                 case CCA_NS_VAL_INFRA:
  2099.                     prof->network_type = WLAN_NETWORK_TYPE_INFRA;
  2100.                     break;
  2101.                 case CCA_NS_VAL_ADHOC:
  2102.                     prof->network_type = WLAN_NETWORK_TYPE_ADHOC;
  2103.                     break;
  2104.                 default:
  2105.                     return CCA_STATUS_FAIL;
  2106.             }
  2107.             
  2108.             break;
  2109.         case CCA_NS_OMA_WPA_PRES_KEY_ASC:
  2110.             
  2111.             /* Whether the value is presented and the type is legal. */
  2112.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2113.             {
  2114.                 return CCA_STATUS_FAIL;
  2115.             }
  2116.             /* Check whether the length of the passphrase is legal. */
  2117.             str_len = mmi_chset_utf8_strlen((kal_uint8 *)param->values.s[0]);
  2118.             if (str_len + 1 < MIN_PASSPHRASE_LEN || str_len + 1 > MAX_PASSPHRASE_LEN) 
  2119.             {
  2120.                 return CCA_STATUS_FAIL;
  2121.             }
  2122.             /* Whether this is a ASCII string. */
  2123.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  2124.             {
  2125.                 return CCA_STATUS_FAIL;
  2126.             }
  2127.             /* Get passphrase in ASCII format. Zero-terminate passphrase. */
  2128.             strcpy((S8 *)prof->passphrase, param->values.s[0]);
  2129.             break;
  2130.         case CCA_NS_OMA_WPA_PRES_KEY_HEX:
  2131.             /* Whether the value is presented and the type is legal. */
  2132.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2133.             {
  2134.                 return CCA_STATUS_FAIL;
  2135.             }
  2136.             /* Length of the Base64 data should be 88 bytes for 64 HEX chars 
  2137.                (256 bits). Please refer to Base64 encoding method. */
  2138.             str_len = mmi_chset_utf8_strlen((kal_uint8 *)param->values.s[0]);
  2139.             if (str_len != 88) 
  2140.             {
  2141.                 return CCA_STATUS_FAIL;
  2142.             }
  2143.             /* Whether this is a ASCII string. */
  2144.             if (mmi_wlan_is_ascii_string((U8 *)param->values.s[0]) == MMI_FALSE) 
  2145.             {
  2146.                 return CCA_STATUS_FAIL;
  2147.             }
  2148.             /* Obtain the HEX format pre-shared key. It should be 64 bytes. */
  2149.             if (mmi_wlan_base64_decoder(
  2150.                     (S8 *)base64_buf, 
  2151.                     sizeof(base64_buf) / sizeof(U8), 
  2152.                     param->values.s[0], 
  2153.                     str_len) != 64) 
  2154.             {
  2155.                 return CCA_STATUS_FAIL;
  2156.             }
  2157.             /* Convert 64 bytes HEX data to 256 bits raw data. */
  2158.             if (mmi_wlan_hex_to_psk(prof->psk, base64_buf, 64) == MMI_FALSE) 
  2159.             {
  2160.                 return CCA_STATUS_FAIL;
  2161.             }
  2162.             /* Turn on the 33-bytes when PSK is set. */
  2163.             prof->psk[32] = 1;
  2164.             
  2165.             break;
  2166.         case CCA_NS_OMA_WEPKEYIND:
  2167.             /* Whether the value is presented and the type is legal. */
  2168.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2169.             {
  2170.                 return CCA_STATUS_FAIL;
  2171.             }
  2172.             /* Check whether the index is legal. */
  2173.             value = atoi(param->values.s[0]);
  2174.             
  2175.             if (value < 0 || value >= MAX_WEP_KEY_NUM) 
  2176.             {
  2177.                 return CCA_STATUS_FAIL;
  2178.             }
  2179.             prof->wep_key_index = value;
  2180.             
  2181.             break;
  2182.         case CCA_NS_OMA_WEPAUTHMODE:
  2183.             /* Whether the value is presented and the type is legal. */
  2184.             if (param->size <= 0 || param->type != CCA_DT_INT) 
  2185.             {
  2186.                 return CCA_STATUS_FAIL;
  2187.             }
  2188.             /* Extract the setting. */
  2189.             switch (param->values.i[0])
  2190.             {
  2191.                 case CCA_NS_VAL_OPEN:
  2192.                     prof->auth_mode = WLAN_AUTH_MODE_OPEN;
  2193.                     break;
  2194.             
  2195.                 case CCA_NS_VAL_SHARED:
  2196.                     prof->auth_mode = WLAN_AUTH_MODE_SHARED;
  2197.                     break;
  2198.             
  2199.                 default:
  2200.                     return CCA_STATUS_FAIL;
  2201.             }
  2202.             
  2203.             break;
  2204.         case CCA_NS_OMA_SECMODE:
  2205.         default:
  2206.             break;
  2207.     }
  2208.     return CCA_STATUS_OK;
  2209. }
  2210. /*****************************************************************************
  2211.  * FUNCTION
  2212.  *  mmi_wlan_proc_cca_param_napdef
  2213.  * DESCRIPTION
  2214.  *  This function processes the parameter of WLAN node.
  2215.  * PARAMETERS
  2216.  *  param           [IN]            A parameter with its values
  2217.  *  cntx            [IN/OUT]        The WLAN OTAP control block
  2218.  * RETURNS
  2219.  *  On success, return OK; otherwise, return FAIL.
  2220.  *****************************************************************************/
  2221. cca_status_enum mmi_wlan_proc_cca_param_napdef(
  2222.                     const cca_core_data_struct *param, 
  2223.                     mmi_wlan_otap_struct *cntx)
  2224. {
  2225.     /*----------------------------------------------------------------*/
  2226.     /* Local Variables                                                */
  2227.     /*----------------------------------------------------------------*/
  2228.     S32 str_len;
  2229.     /*----------------------------------------------------------------*/
  2230.     /* Code Body                                                      */
  2231.     /*----------------------------------------------------------------*/
  2232.     /* 
  2233.      * Dispatching according to the parameter symbol 
  2234.      */
  2235.     switch (param->id)
  2236.     {
  2237.         case CCA_NS_NODEID:
  2238.             /* Whether the value is presented and the type is legal. */
  2239.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2240.             {
  2241.                 return CCA_STATUS_FAIL;
  2242.             }
  2243.             
  2244.             /* Whether the string's raw length is legal. */
  2245.             str_len = strlen(param->values.s[0]);
  2246.             if (str_len + 1 > MAX_NODE_ID_LEN) 
  2247.             {
  2248.                 return CCA_STATUS_FAIL;
  2249.             }
  2250.             
  2251.             /* Extract the node id. Store it as UTF-8 string. */
  2252.             strcpy((S8 *)cntx->node_id, param->values.s[0]);
  2253.             break;
  2254.         case CCA_NS_OMA_NAME:
  2255.             /* Whether the value is presented and the type is legal. If it's
  2256.                illegal, default name will be used. Still return OK. */
  2257.             if (param->size <= 0 || param->type != CCA_DT_STR) 
  2258.             {
  2259.                 return CCA_STATUS_OK;   /* Error-tolerant for profile's name */
  2260.             }
  2261.             /* Extract the profile's name. If the name is too long, it will be
  2262.                truncated by the function. */
  2263.             mmi_chset_utf8_to_ucs2_string(
  2264.                 cntx->name, 
  2265.                 MAX_WLAN_PROF_NAME_LEN * ENCODING_LENGTH, 
  2266.                 (U8 *)param->values.s[0]);
  2267.             break;
  2268.                         
  2269.         case CCA_NS_OMA_NAPID:
  2270.         case CCA_NS_OMA_BEARER:
  2271.         default:
  2272.             /* All other parameters are skipped. And the status is OK. */
  2273.             break;
  2274.     }
  2275.     return CCA_STATUS_OK;
  2276. }
  2277. /*****************************************************************************
  2278.  * FUNCTION
  2279.  *  mmi_wlan_proc_cca_nodes
  2280.  * DESCRIPTION
  2281.  *  The node callback function used when processing a CCA document.
  2282.  * PARAMETERS
  2283.  *  doc_hdl         [IN]            Configuration document handle
  2284.  *  node_hdl        [IN]            The node handle
  2285.  *  symbol          [IN]            The converted node symbol
  2286.  *  param_list      [IN]            List of parameters in the node
  2287.  *  user_data       [IN]            User data         
  2288.  * RETURNS
  2289.  *  On success, return OK; otherwise, return FAIL.
  2290.  *****************************************************************************/
  2291. cca_status_enum mmi_wlan_proc_cca_nodes(
  2292.                     S32 doc_hdl, 
  2293.                     S32 node_hdl, 
  2294.                     U16 symbol, 
  2295.                     cca_iterator_struct *param_list, 
  2296.                     void *user_data)
  2297. {
  2298.     /*----------------------------------------------------------------*/
  2299.     /* Local Variables                                                */
  2300.     /*----------------------------------------------------------------*/
  2301.     mmi_wlan_otap_struct *cntx;
  2302.     cca_core_data_struct *param;
  2303.     S8 *value_s;
  2304.     S32 value_i;
  2305.     S32 wep_key_index;
  2306.     cca_status_enum status;
  2307.     S16 index;
  2308.     
  2309.     /*----------------------------------------------------------------*/
  2310.     /* Code Body                                                      */
  2311.     /*----------------------------------------------------------------*/
  2312.     /* Obtain the control block. */
  2313.     cntx = (mmi_wlan_otap_struct *)user_data;
  2314.     /* We always process NAPDEF nodes to obtain node_id. We always process
  2315.        WLAN nodes to obtain profiles. For other nodes, the behavior is
  2316.        controlled by is_active parameter. */
  2317.     if (symbol != WLAN_OTAP_NS_NAPDEF && symbol != WLAN_OTAP_NS_WLAN &&
  2318.         cntx->is_active != MMI_TRUE) 
  2319.     {
  2320.         return CCA_STATUS_OK;
  2321.     }
  2322.     /* 
  2323.      * Dispatch the node according to the node symbol.
  2324.      */
  2325.     status = CCA_STATUS_OK;             /* Initialize the status variable   */
  2326.     index  = cntx->num_profiles - 1;    /* Obtain the last profile          */
  2327.     
  2328.     switch (symbol)
  2329.     {
  2330.         case WLAN_OTAP_NS_NAPDEF:
  2331.             /* Clear node_id and name for previous NAPDEF node. */
  2332.             memset(cntx->node_id, 0, MAX_NODE_ID_LEN);
  2333.             memset(cntx->name, 0, MAX_WLAN_PROF_NAME_LEN * ENCODING_LENGTH);
  2334.             /* Traverse each parameter in NAPDEF node. */ 
  2335.             while (mmi_cca_doc_nodedata_next(param_list, &param) == CCA_STATUS_OK && status == CCA_STATUS_OK)
  2336.             {
  2337.                 status = mmi_wlan_proc_cca_param_napdef(param, cntx);
  2338.             }
  2339.             /* NAPDEF doesn't know the correctness of a WLAN profile. Always 
  2340.                return OK. */
  2341.             return CCA_STATUS_OK;
  2342.             
  2343.         case WLAN_OTAP_NS_WLAN:
  2344.             /* Whether we have node_id */
  2345.             if (strlen((S8 *)cntx->node_id) == 0) 
  2346.             {
  2347.                 cntx->is_active = MMI_FALSE;
  2348.                 return CCA_STATUS_FAIL;
  2349.             }
  2350.             
  2351.             /* Prepare a storage for the new profile. And get the new index. */
  2352.             if ((index = mmi_wlan_new_otap_profile(cntx)) < 0)
  2353.             {
  2354.                 cntx->is_active = MMI_FALSE;
  2355.                 return CCA_STATUS_FAIL;
  2356.             }
  2357.             /* Enable to process parameters/nodes in the WLAN node. */
  2358.             cntx->is_active = MMI_TRUE;
  2359.             /* Remember the name, and node_id which this profile belongs to. */
  2360.             if (UCS2Strlen((S8 *)cntx->name) != 0) 
  2361.             {
  2362.                 UCS2Strcpy((S8 *)cntx->profile[index]->name, (S8 *)cntx->name);
  2363.             }
  2364.             strcpy((S8 *)cntx->profile[index]->node_id, (S8 *)cntx->node_id);
  2365.                         
  2366.             /* Before processing other parameters, obtain the security mode. */
  2367.             if (mmi_cca_doc_get_nodedata_int_first(param_list, CCA_NS_OMA_SECMODE, &value_i) == CCA_STATUS_OK)
  2368.             {
  2369.                 switch (value_i)
  2370.                 {
  2371.                     case CCA_NS_VAL_WEP:
  2372.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_SHARED;
  2373.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_WEP;
  2374.                         break;
  2375.                 
  2376.                     case CCA_NS_VAL_8021X:
  2377.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_IEEE8021X;
  2378.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_WEP;
  2379.                         break;
  2380.                 
  2381.                     case CCA_NS_VAL_WPA:
  2382.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_WPA;
  2383.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_TKIP;
  2384.                         break;
  2385.                 
  2386.                     case CCA_NS_VAL_WPA_PRESHARED_KEY:
  2387.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_WPAPSK;
  2388.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_TKIP;
  2389.                         break;
  2390.                 
  2391.                     case CCA_NS_VAL_WPA2:
  2392.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_WPA;
  2393.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_AES;
  2394.                         break;
  2395.                 
  2396.                     case CCA_NS_VAL_WPA2_PRESHARED_KEY:
  2397.                         cntx->profile[index]->auth_mode     = WLAN_AUTH_MODE_WPAPSK;
  2398.                         cntx->profile[index]->encrypt_mode  = WLAN_ENCRYPT_MODE_AES;
  2399.                         break;
  2400.                 
  2401.                     default:
  2402.                         return CCA_STATUS_FAIL;
  2403.                 }
  2404.             }
  2405.             
  2406.             /* Traverse other parameter in WLAN node */
  2407.             mmi_cca_iterator_restart(param_list);
  2408.             while (mmi_cca_doc_nodedata_next(param_list, &param) == CCA_STATUS_OK && status == CCA_STATUS_OK)
  2409.             {
  2410.                 status = mmi_wlan_proc_cca_param_wlan(param, cntx->profile[index]);
  2411.             }
  2412.             break;
  2413.         case WLAN_OTAP_NS_EAP:
  2414.             /* Traverse each parameter in EAP node */
  2415.             while (mmi_cca_doc_nodedata_next(param_list, &param) == CCA_STATUS_OK && status == CCA_STATUS_OK)
  2416.             {
  2417.                 status = mmi_wlan_proc_cca_param_eap(param, cntx->profile[index]);
  2418.             }
  2419.             break;
  2420.             
  2421.         case WLAN_OTAP_NS_WEPKEY:
  2422.             /* Return if WEP key has been set. */
  2423.             if (strlen((S8 *)cntx->profile[index]->wep_key) != 0) 
  2424.             {
  2425.                 return CCA_STATUS_OK;
  2426.             }
  2427.             /* Pre-determine the key index if it's presented. */
  2428.             if (mmi_cca_doc_get_nodedata_str_first(param_list, CCA_NS_OMA_INDEX, &value_s) != CCA_STATUS_OK)
  2429.             {
  2430.                 wep_key_index = MAX_WEP_KEY_NUM; /* Init an invalid index */
  2431.             }
  2432.             else
  2433.             {
  2434.                 /* If it's presented, the range must be correct. */
  2435.                 wep_key_index = atoi(value_s);
  2436.                 
  2437.                 if (wep_key_index < 0 || wep_key_index >= MAX_WEP_KEY_NUM) 
  2438.                 {
  2439.                     return CCA_STATUS_OK;
  2440.                 }
  2441.             }
  2442.             
  2443.             /* If WEP key index is specified in WLAN node, it must match the
  2444.                index in this WEPKEY node. */
  2445.             if (cntx->profile[index]->wep_key_index < MAX_WEP_KEY_NUM)
  2446.             {
  2447.                 if (wep_key_index != cntx->profile[index]->wep_key_index) 
  2448.                 {
  2449.                     return CCA_STATUS_OK;
  2450.                 } 
  2451.             }
  2452.             
  2453.             /* Traverse each parameter in WEPKEY node */
  2454.             mmi_cca_iterator_restart(param_list);
  2455.             while (mmi_cca_doc_nodedata_next(param_list, &param) == CCA_STATUS_OK && status == CCA_STATUS_OK)
  2456.             {
  2457.                 status = mmi_wlan_proc_cca_param_wepkey(param, cntx->profile[index]);
  2458.             }
  2459.             /* If successfully get the WEP key, update the key index. */
  2460.             if (strlen((S8 *)cntx->profile[index]->wep_key) != 0) 
  2461.             {
  2462.                 cntx->profile[index]->wep_key_index = (wep_key_index < MAX_WEP_KEY_NUM? wep_key_index: 0);
  2463.             }
  2464.             
  2465.             break;
  2466.         case WLAN_OTAP_NS_SEC_SSID:
  2467.         case WLAN_OTAP_NS_CERT:
  2468.         
  2469.             /* Useless characteristic type. Still return OK since the profile 
  2470.                might work well even without these settings. And this will be 
  2471.                checked in the validation phase. */
  2472.             return CCA_STATUS_OK;
  2473.         default:
  2474.             /* A traversing not matched to the namespace definition. */
  2475.             MMI_ASSERT(0);
  2476.     }
  2477.     /* If the node or any parameters of the node can not be processed, update
  2478.        the context to stop processing the current profile. And release the 
  2479.        memory of the current profile. */
  2480.     if (status == CCA_STATUS_FAIL)
  2481.     {
  2482.         cntx->is_active = MMI_FALSE;
  2483.         mmi_wlan_free_otap_profile(cntx, index);
  2484.     }
  2485.     
  2486.     return status;
  2487. }
  2488. /*****************************************************************************
  2489.  * FUNCTION
  2490.  *  mmi_wlan_proc_cca_doc
  2491.  * DESCRIPTION
  2492.  *  This function is responsible for processing a CCA document relevant to WLAN
  2493.  *  data account.
  2494.  * PARAMETERS
  2495.  *  conf_id         [IN]            CCA configuration ID
  2496.  *  doc_hdl         [IN]            Configuration document handle
  2497.  * RETURNS
  2498.  *  void
  2499.  *****************************************************************************/
  2500. void mmi_wlan_proc_cca_doc(U16 conf_id, S32 doc_hdl)
  2501. {
  2502.     /*----------------------------------------------------------------*/
  2503.     /* Local Variables                                                */
  2504.     /*----------------------------------------------------------------*/
  2505.     /*
  2506.      * Mapping table used to extract the WLAN settings for each profile. All 
  2507.      * characteristics are included such that unsupported fields can also be
  2508.      * found out.
  2509.      */
  2510.     const U16 proc_tbl[] = 
  2511.     {
  2512.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, 
  2513.             WLAN_OTAP_NS_NAPDEF, 0xFFFF,
  2514.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, CCA_NS_OMA_WLAN, 
  2515.             WLAN_OTAP_NS_WLAN, 0xFFFF,
  2516.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, CCA_NS_OMA_WLAN, CCA_NS_OMA_SEC_SSID, 
  2517.             WLAN_OTAP_NS_SEC_SSID, 0xFFFF,
  2518.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, CCA_NS_OMA_WLAN, CCA_NS_OMA_EAP, 
  2519.             WLAN_OTAP_NS_EAP, 0xFFFF,
  2520.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, CCA_NS_OMA_WLAN, CCA_NS_OMA_EAP, CCA_NS_OMA_CERT, 
  2521.             WLAN_OTAP_NS_CERT, 0xFFFF,
  2522.         CCA_NS_TRIGNODE, CCA_NS_OMA_NAPDEF, CCA_NS_OMA_WLAN, CCA_NS_OMA_WEPKEY, 
  2523.             WLAN_OTAP_NS_WEPKEY, 0xFFFF
  2524.     };
  2525.     cca_status_enum status;
  2526.     U8 i;
  2527.     
  2528.     /*----------------------------------------------------------------*/
  2529.     /* Code Body                                                      */
  2530.     /*----------------------------------------------------------------*/
  2531.     MMI_TRACE((MMI_TRACE_G7_MISC, MMI_CCA_WLAN_RECV_DOC));
  2532.     /* Whether any other OTA provisioning process is still running. */
  2533.     if (g_wlan_otap != NULL) 
  2534.     {
  2535.         MMI_ASSERT(0);  /* Guaranteed by CCA that this should not happen */
  2536.     }
  2537.     
  2538.     /* Init control block and save the ID/handle for the response msg. */
  2539.     g_wlan_otap = mmi_wlan_new_otap_cntx(conf_id, doc_hdl);
  2540.     if (g_wlan_otap == NULL) 
  2541.     {
  2542.         mmi_wlan_send_cca_app_configure_rsp(conf_id, doc_hdl, CCA_STATUS_FAIL);
  2543.         return;
  2544.     }
  2545.     
  2546.     /* Extract WLAN settings from CCA configuration document, and store 
  2547.        settings in the temporary storage. */
  2548.     status = mmi_cca_doc_process(
  2549.                 doc_hdl, 
  2550.                 proc_tbl,
  2551.                 sizeof(proc_tbl) / sizeof(U16),
  2552.                 NULL, 
  2553.                 mmi_wlan_proc_cca_nodes, 
  2554.                 g_wlan_otap);
  2555.     /* Whether each profile contains all mandatory fields. */
  2556.     for (i = 0; i < g_wlan_otap->num_profiles; ) 
  2557.     {
  2558.         /* If valid, examine next profile. If invalid, free the profile. */
  2559.         if (mmi_wlan_validate_profile(g_wlan_otap->profile[i]) == MMI_TRUE)
  2560.         {
  2561.             ++i;
  2562.         } 
  2563.         else 
  2564.         {
  2565.             /* Profiles are shifted. No need to increase the index. */
  2566.             mmi_wlan_free_otap_profile(g_wlan_otap, i);
  2567.             status = CCA_STATUS_FAIL;
  2568.         }
  2569.     }
  2570.     /* If there is no correct WLAN profile, send a FAIL response message back
  2571.        to CCA. Popup a notification screen to inform the user. */
  2572.     if (g_wlan_otap->num_profiles == 0) 
  2573.     {
  2574.         /* Display the notification screen. */
  2575.         /* mmi_wlan_show_info(STR_ID_DTCNT_WLAN_ERROR_NO_PROFILES); */
  2576.         
  2577.         /* Now, terminate the WLAN OTA provisioning application. */
  2578.         mmi_wlan_send_cca_app_configure_rsp(conf_id, doc_hdl, CCA_STATUS_INVALID_SETTING);
  2579.         mmi_wlan_free_otap_cntx();
  2580.         return;
  2581.     }
  2582.     /* 
  2583.      * Start the WLAN OTA provisioning application to interact with user.
  2584.      */
  2585.     
  2586.     /* Popup a notification screen if any incoming profile is problematic. */
  2587. #if 0
  2588. /* under construction !*/
  2589. /* under construction !*/
  2590. /* under construction !*/
  2591. /* under construction !*/
  2592. #endif
  2593.     /* Setup callback to free memory and send message back to CCA when users
  2594.        press END key and return to idle screen, or when the app exits. */
  2595.     SetDelScrnIDCallbackHandler(SCR_ID_DTCNT_WLAN_INSTALL_PROFILE, mmi_wlan_abort_otap_app);
  2596.     /* Ready to install profiles. */
  2597.     mmi_wlan_entry_installation();
  2598. }
  2599. /*****************************************************************************
  2600.  * FUNCTION
  2601.  *  mmi_wlan_is_cca_target
  2602.  * DESCRIPTION
  2603.  *  This function examines whether the configuration document has any settings
  2604.  *  relevant to WLAN data account.
  2605.  * PARAMETERS
  2606.  *  conf_id         [IN]            CCA configuration ID
  2607.  *  doc_hdl         [IN]            Configuration document handle
  2608.  *  data_list       [IN]            Level one node IDs and application IDs
  2609.  * RETURNS
  2610.  *  Return CCA_STATUS_OK if the document is relevant to WLAN data account; 
  2611.  *  otherwise, return CCA_STATUS_NOT_FOUND.
  2612.  *****************************************************************************/
  2613. cca_status_enum mmi_wlan_is_cca_target(
  2614.                     U16 conf_id, 
  2615.                     S32 doc_hdl, 
  2616.                     cca_iterator_struct *data_list)
  2617. {
  2618.     /*----------------------------------------------------------------*/
  2619.     /* Local Variables                                                */
  2620.     /*----------------------------------------------------------------*/
  2621.     cca_iterator_struct *node_list, *param_list;
  2622.     S32 num_nodes, num_params;
  2623.     cca_status_enum status;
  2624.     
  2625.     /*----------------------------------------------------------------*/
  2626.     /* Code Body                                                      */
  2627.     /*----------------------------------------------------------------*/
  2628.     /* Check whether NAPDEF nodes are presented in the document. */
  2629.     status = mmi_cca_doc_get_nodes(doc_hdl, CCA_NS_OMA_NAPDEF, &node_list, &num_nodes);
  2630.     if (status != CCA_STATUS_OK) 
  2631.     {
  2632.         return CCA_STATUS_NOT_FOUND;
  2633.     }
  2634.     /* Check whether there are NAPDEF nodes that have a BEARER parameter with
  2635.        the value of WLAN. */
  2636.     while (mmi_cca_iterator_next(node_list) != NULL)
  2637.     {
  2638.         /* Extract all parameters and their values in the current node. */
  2639.         status = mmi_cca_doc_get_nodedata(node_list, &param_list, &num_params);
  2640.         if (status != CCA_STATUS_OK) 
  2641.         {
  2642.             continue;   /* No need to release param iterator here */
  2643.         }
  2644.         
  2645.         /* Whether there is a WLAN bearer in the NAPDEF node */
  2646.         if (mmi_wlan_has_otap_profile(param_list) == MMI_TRUE)
  2647.         {
  2648.             /* Release memory and return OK */    
  2649.             mmi_cca_iterator_release(node_list);
  2650.             mmi_cca_iterator_release(param_list);
  2651.             return CCA_STATUS_OK;
  2652.         }
  2653.         /* Release memory for the current node. */
  2654.         mmi_cca_iterator_release(param_list);
  2655.     }
  2656.     
  2657.     /* Release memory and return NOT_FOUND */
  2658.     mmi_cca_iterator_release(node_list);
  2659.     
  2660.     return CCA_STATUS_NOT_FOUND;
  2661. }
  2662. /***************************************************************************** 
  2663.  * Use the proprietary OTAP spec. 
  2664.  *****************************************************************************/
  2665. #elif defined(__MMI_WLAN_OTAP_DMP__)
  2666. /* under construction !*/
  2667. /* under construction !*/
  2668. /* under construction !*/
  2669. /* under construction !*/
  2670. /* under construction !*/
  2671. /* under construction !*/
  2672. /* under construction !*/
  2673. /* under construction !*/
  2674. /* under construction !*/
  2675. /* under construction !*/
  2676. /* under construction !*/
  2677. /* under construction !*/
  2678. /* under construction !*/
  2679. /* under construction !*/
  2680. /* under construction !*/
  2681. /* under construction !*/
  2682. /* under construction !*/
  2683. /* under construction !*/
  2684. /* under construction !*/
  2685. /* under construction !*/
  2686. /* under construction !*/
  2687. /* under construction !*/
  2688. /* under construction !*/
  2689. /* under construction !*/
  2690. /* under construction !*/
  2691. /* under construction !*/
  2692. /* under construction !*/
  2693. /* under construction !*/
  2694. /* under construction !*/
  2695. /* under construction !*/
  2696. /* under construction !*/
  2697. /* under construction !*/
  2698. /* under construction !*/
  2699. /* under construction !*/
  2700. /* under construction !*/
  2701. /* under construction !*/
  2702. /* under construction !*/
  2703. /* under construction !*/
  2704. /* under construction !*/
  2705. /* under construction !*/
  2706. /* under construction !*/
  2707. /* under construction !*/
  2708. /* under construction !*/
  2709. /* under construction !*/
  2710. /* under construction !*/
  2711. /* under construction !*/
  2712. /* under construction !*/
  2713. /* under construction !*/
  2714. /* under construction !*/
  2715. /* under construction !*/
  2716. /* under construction !*/
  2717. /* under construction !*/
  2718. /* under construction !*/
  2719. /* under construction !*/
  2720. /* under construction !*/
  2721. /* under construction !*/
  2722. /* under construction !*/
  2723. /* under construction !*/
  2724. /* under construction !*/
  2725. /* under construction !*/
  2726. /* under construction !*/
  2727. /* under construction !*/
  2728. /* under construction !*/
  2729. /* under construction !*/
  2730. /* under construction !*/
  2731. /* under construction !*/
  2732. /* under construction !*/
  2733. /* under construction !*/
  2734. /* under construction !*/
  2735. /* under construction !*/
  2736. /* under construction !*/
  2737. /* under construction !*/
  2738. /* under construction !*/
  2739. /* under construction !*/
  2740. /* under construction !*/
  2741. /* under construction !*/
  2742. /* under construction !*/
  2743. /* under construction !*/
  2744. /* under construction !*/
  2745. /* under construction !*/
  2746. /* under construction !*/
  2747. /* under construction !*/
  2748. /* under construction !*/
  2749. /* under construction !*/
  2750. /* under construction !*/
  2751. /* under construction !*/
  2752. /* under construction !*/
  2753. /* under construction !*/
  2754. /* under construction !*/
  2755. /* under construction !*/
  2756. /* under construction !*/
  2757. /* under construction !*/
  2758. /* under construction !*/
  2759. /* under construction !*/
  2760. /* under construction !*/
  2761. /* under construction !*/
  2762. /* under construction !*/
  2763. /* under construction !*/
  2764. /* under construction !*/
  2765. /* under construction !*/
  2766. /* under construction !*/
  2767. /* under construction !*/
  2768. /* under construction !*/
  2769. /* under construction !*/
  2770. /* under construction !*/
  2771. /* under construction !*/
  2772. /* under construction !*/
  2773. /* under construction !*/
  2774. /* under construction !*/
  2775. /* under construction !*/
  2776. /* under construction !*/
  2777. /* under construction !*/
  2778. /* under construction !*/
  2779. /* under construction !*/
  2780. /* under construction !*/
  2781. /* under construction !*/
  2782. /* under construction !*/
  2783. /* under construction !*/
  2784. /* under construction !*/
  2785. /* under construction !*/
  2786. /* under construction !*/
  2787. /* under construction !*/
  2788. /* under construction !*/
  2789. /* under construction !*/
  2790. /* under construction !*/
  2791. /* under construction !*/
  2792. /* under construction !*/
  2793. /* under construction !*/
  2794. /* under construction !*/
  2795. /* under construction !*/
  2796. /* under construction !*/
  2797. /* under construction !*/
  2798. /* under construction !*/
  2799. /* under construction !*/
  2800. /* under construction !*/
  2801. /* under construction !*/
  2802. /* under construction !*/
  2803. /* under construction !*/
  2804. /* under construction !*/
  2805. /* under construction !*/
  2806. /* under construction !*/
  2807. /* under construction !*/
  2808. /* under construction !*/
  2809. /* under construction !*/
  2810. /* under construction !*/
  2811. /* under construction !*/
  2812. /* under construction !*/
  2813. /* under construction !*/
  2814. /* under construction !*/
  2815. /* under construction !*/
  2816. /* under construction !*/
  2817. /* under construction !*/
  2818. /* under construction !*/
  2819. /* under construction !*/
  2820. /* under construction !*/
  2821. /* under construction !*/
  2822. /* under construction !*/
  2823. /* under construction !*/
  2824. /* under construction !*/
  2825. /* under construction !*/
  2826. /* under construction !*/
  2827. /* under construction !*/
  2828. /* under construction !*/
  2829. /* under construction !*/
  2830. /* under construction !*/
  2831. /* under construction !*/
  2832. /* under construction !*/
  2833. /* under construction !*/
  2834. /* under construction !*/
  2835. /* under construction !*/
  2836. /* under construction !*/
  2837. /* under construction !*/
  2838. /* under construction !*/
  2839. /* under construction !*/
  2840. /* under construction !*/
  2841. /* under construction !*/
  2842. /* under construction !*/
  2843. /* under construction !*/
  2844. /* under construction !*/
  2845. /* under construction !*/
  2846. /* under construction !*/
  2847. /* under construction !*/
  2848. /* under construction !*/
  2849. /* under construction !*/
  2850. /* under construction !*/
  2851. /* under construction !*/
  2852. /* under construction !*/
  2853. /* under construction !*/
  2854. /* under construction !*/
  2855. /* under construction !*/
  2856. /* under construction !*/
  2857. /* under construction !*/
  2858. /* under construction !*/
  2859. /* under construction !*/
  2860. /* under construction !*/
  2861. /* under construction !*/
  2862. /* under construction !*/
  2863. /* under construction !*/
  2864. /* under construction !*/
  2865. /* under construction !*/
  2866. /* under construction !*/
  2867. /* under construction !*/
  2868. /* under construction !*/
  2869. /* under construction !*/
  2870. /* under construction !*/
  2871. /* under construction !*/
  2872. /* under construction !*/
  2873. /* under construction !*/
  2874. /* under construction !*/
  2875. /* under construction !*/
  2876. /* under construction !*/
  2877. /* under construction !*/
  2878. /* under construction !*/
  2879. /* under construction !*/
  2880. /* under construction !*/
  2881. /* under construction !*/
  2882. /* under construction !*/
  2883. /* under construction !*/
  2884. /* under construction !*/
  2885. /* under construction !*/
  2886. /* under construction !*/
  2887. /* under construction !*/
  2888. /* under construction !*/
  2889. /* under construction !*/
  2890. /* under construction !*/
  2891. /* under construction !*/
  2892. /* under construction !*/
  2893. /* under construction !*/
  2894. /* under construction !*/
  2895. /* under construction !*/
  2896. /* under construction !*/
  2897. /* under construction !*/
  2898. /* under construction !*/
  2899. /* under construction !*/
  2900. /* under construction !*/
  2901. /* under construction !*/
  2902. /* under construction !*/
  2903. /* under construction !*/
  2904. /* under construction !*/
  2905. /* under construction !*/
  2906. /* under construction !*/
  2907. /* under construction !*/
  2908. /* under construction !*/
  2909. /* under construction !*/
  2910. /* under construction !*/
  2911. /* under construction !*/
  2912. /* under construction !*/
  2913. /* under construction !*/
  2914. /* under construction !*/
  2915. /* under construction !*/
  2916. /* under construction !*/
  2917. /* under construction !*/
  2918. /* under construction !*/
  2919. /* under construction !*/
  2920. /* under construction !*/
  2921. /* under construction !*/
  2922. /* under construction !*/
  2923. /* under construction !*/
  2924. /* under construction !*/
  2925. /* under construction !*/
  2926. /* under construction !*/
  2927. /* under construction !*/
  2928. /* under construction !*/
  2929. /* under construction !*/
  2930. /* under construction !*/
  2931. /* under construction !*/
  2932. /* under construction !*/
  2933. /* under construction !*/
  2934. /* under construction !*/
  2935. /* under construction !*/
  2936. /* under construction !*/
  2937. /* under construction !*/
  2938. /* under construction !*/
  2939. /* under construction !*/
  2940. /* under construction !*/
  2941. /* under construction !*/
  2942. /* under construction !*/
  2943. /* under construction !*/
  2944. /* under construction !*/
  2945. /* under construction !*/
  2946. /* under construction !*/
  2947. /* under construction !*/
  2948. /* under construction !*/
  2949. /* under construction !*/
  2950. /* under construction !*/
  2951. /* under construction !*/
  2952. /* under construction !*/
  2953. /* under construction !*/
  2954. /* under construction !*/
  2955. /* under construction !*/
  2956. /* under construction !*/
  2957. /* under construction !*/
  2958. /* under construction !*/
  2959. /* under construction !*/
  2960. /* under construction !*/
  2961. /* under construction !*/
  2962. /* under construction !*/
  2963. /* under construction !*/
  2964. /* under construction !*/
  2965. /* under construction !*/
  2966. /* under construction !*/
  2967. /* under construction !*/
  2968. /* under construction !*/
  2969. /* under construction !*/
  2970. /* under construction !*/
  2971. /* under construction !*/
  2972. /* under construction !*/
  2973. /* under construction !*/
  2974. /* under construction !*/
  2975. /* under construction !*/
  2976. /* under construction !*/
  2977. /* under construction !*/
  2978. /* under construction !*/
  2979. /* under construction !*/
  2980. /* under construction !*/
  2981. /* under construction !*/
  2982. /* under construction !*/
  2983. /* under construction !*/
  2984. /* under construction !*/
  2985. /* under construction !*/
  2986. /* under construction !*/
  2987. /* under construction !*/
  2988. /* under construction !*/
  2989. /* under construction !*/
  2990. /* under construction !*/
  2991. /* under construction !*/
  2992. /* under construction !*/
  2993. /* under construction !*/
  2994. /* under construction !*/
  2995. /* under construction !*/
  2996. /* under construction !*/
  2997. /* under construction !*/
  2998. /* under construction !*/
  2999. /* under construction !*/
  3000. /* under construction !*/
  3001. /* under construction !*/
  3002. /* under construction !*/
  3003. /* under construction !*/
  3004. /* under construction !*/
  3005. /* under construction !*/
  3006. /* under construction !*/
  3007. /* under construction !*/
  3008. /* under construction !*/
  3009. /* under construction !*/
  3010. /* under construction !*/
  3011. /* under construction !*/
  3012. /* under construction !*/
  3013. /* under construction !*/
  3014. /* under construction !*/
  3015. /* under construction !*/
  3016. /* under construction !*/
  3017. /* under construction !*/
  3018. /* under construction !*/
  3019. /* under construction !*/
  3020. /* under construction !*/
  3021. /* under construction !*/
  3022. /* under construction !*/
  3023. /* under construction !*/
  3024. /* under construction !*/
  3025. /* under construction !*/
  3026. /* under construction !*/
  3027. /* under construction !*/
  3028. /* under construction !*/
  3029. /* under construction !*/
  3030. /* under construction !*/
  3031. /* under construction !*/
  3032. /* under construction !*/
  3033. /* under construction !*/
  3034. /* under construction !*/
  3035. /* under construction !*/
  3036. /* under construction !*/
  3037. /* under construction !*/
  3038. /* under construction !*/
  3039. /* under construction !*/
  3040. /* under construction !*/
  3041. /* under construction !*/
  3042. /* under construction !*/
  3043. /* under construction !*/
  3044. /* under construction !*/
  3045. /* under construction !*/
  3046. /* under construction !*/
  3047. /* under construction !*/
  3048. /* under construction !*/
  3049. /* under construction !*/
  3050. /* under construction !*/
  3051. /* under construction !*/
  3052. /* under construction !*/
  3053. /* under construction !*/
  3054. /* under construction !*/
  3055. /* under construction !*/
  3056. /* under construction !*/
  3057. /* under construction !*/
  3058. /* under construction !*/
  3059. /* under construction !*/
  3060. /* under construction !*/
  3061. /* under construction !*/
  3062. /* under construction !*/
  3063. /* under construction !*/
  3064. /* under construction !*/
  3065. /* under construction !*/
  3066. /* under construction !*/
  3067. /* under construction !*/
  3068. /* under construction !*/
  3069. /* under construction !*/
  3070. /* under construction !*/
  3071. /* under construction !*/
  3072. /* under construction !*/
  3073. /* under construction !*/
  3074. /* under construction !*/
  3075. /* under construction !*/
  3076. /* under construction !*/
  3077. /* under construction !*/
  3078. /* under construction !*/
  3079. /* under construction !*/
  3080. /* under construction !*/
  3081. /* under construction !*/
  3082. /* under construction !*/
  3083. /* under construction !*/
  3084. /* under construction !*/
  3085. /* under construction !*/
  3086. /* under construction !*/
  3087. /* under construction !*/
  3088. /* under construction !*/
  3089. /* under construction !*/
  3090. /* under construction !*/
  3091. /* under construction !*/
  3092. /* under construction !*/
  3093. /* under construction !*/
  3094. /* under construction !*/
  3095. /* under construction !*/
  3096. /* under construction !*/
  3097. /* under construction !*/
  3098. /* under construction !*/
  3099. /* under construction !*/
  3100. /* under construction !*/
  3101. /* under construction !*/
  3102. /* under construction !*/
  3103. /* under construction !*/
  3104. /* under construction !*/
  3105. /* under construction !*/
  3106. /* under construction !*/
  3107. /* under construction !*/
  3108. /* under construction !*/
  3109. /* under construction !*/
  3110. /* under construction !*/
  3111. /* under construction !*/
  3112. /* under construction !*/
  3113. /* under construction !*/
  3114. /* under construction !*/
  3115. /* under construction !*/
  3116. /* under construction !*/
  3117. /* under construction !*/
  3118. /* under construction !*/
  3119. /* under construction !*/
  3120. /* under construction !*/
  3121. /* under construction !*/
  3122. /* under construction !*/
  3123. /* under construction !*/
  3124. /* under construction !*/
  3125. /* under construction !*/
  3126. /* under construction !*/
  3127. /* under construction !*/
  3128. /* under construction !*/
  3129. /* under construction !*/
  3130. /* under construction !*/
  3131. /* under construction !*/
  3132. /* under construction !*/
  3133. /* under construction !*/
  3134. /* under construction !*/
  3135. /* under construction !*/
  3136. /* under construction !*/
  3137. /* under construction !*/
  3138. /* under construction !*/
  3139. /* under construction !*/
  3140. /* under construction !*/
  3141. /* under construction !*/
  3142. /* under construction !*/
  3143. /* under construction !*/
  3144. /* under construction !*/
  3145. /* under construction !*/
  3146. /* under construction !*/
  3147. /* under construction !*/
  3148. /* under construction !*/
  3149. /* under construction !*/
  3150. /* under construction !*/
  3151. /* under construction !*/
  3152. /* under construction !*/
  3153. /* under construction !*/
  3154. /* under construction !*/
  3155. /* under construction !*/
  3156. /* under construction !*/
  3157. /* under construction !*/
  3158. /* under construction !*/
  3159. /* under construction !*/
  3160. /* under construction !*/
  3161. /* under construction !*/
  3162. /* under construction !*/
  3163. /* under construction !*/
  3164. /* under construction !*/
  3165. /* under construction !*/
  3166. /* under construction !*/
  3167. /* under construction !*/
  3168. /* under construction !*/
  3169. /* under construction !*/
  3170. /* under construction !*/
  3171. /* under construction !*/
  3172. /* under construction !*/
  3173. /* under construction !*/
  3174. /* under construction !*/
  3175. /* under construction !*/
  3176. /* under construction !*/
  3177. /* under construction !*/
  3178. /* under construction !*/
  3179. /* under construction !*/
  3180. /* under construction !*/
  3181. /* under construction !*/
  3182. /* under construction !*/
  3183. /* under construction !*/
  3184. /* under construction !*/
  3185. /* under construction !*/
  3186. /* under construction !*/
  3187. /* under construction !*/
  3188. /* under construction !*/
  3189. /* under construction !*/
  3190. /* under construction !*/
  3191. /* under construction !*/
  3192. /* under construction !*/
  3193. /* under construction !*/
  3194. /* under construction !*/
  3195. /* under construction !*/
  3196. /* under construction !*/
  3197. /* under construction !*/
  3198. /* under construction !*/
  3199. /* under construction !*/
  3200. /* under construction !*/
  3201. /* under construction !*/
  3202. /* under construction !*/
  3203. /* under construction !*/
  3204. /* under construction !*/
  3205. /* under construction !*/
  3206. /* under construction !*/
  3207. /* under construction !*/
  3208. /* under construction !*/
  3209. /* under construction !*/
  3210. /* under construction !*/
  3211. /* under construction !*/
  3212. /* under construction !*/
  3213. /* under construction !*/
  3214. /* under construction !*/
  3215. /* under construction !*/
  3216. /* under construction !*/
  3217. /* under construction !*/
  3218. /* under construction !*/
  3219. /* under construction !*/
  3220. /* under construction !*/
  3221. /* under construction !*/
  3222. /* under construction !*/
  3223. /* under construction !*/
  3224. /* under construction !*/
  3225. /* under construction !*/
  3226. /* under construction !*/
  3227. /* under construction !*/
  3228. /* under construction !*/
  3229. /* under construction !*/
  3230. /* under construction !*/
  3231. /* under construction !*/
  3232. /* under construction !*/
  3233. /* under construction !*/
  3234. /* under construction !*/
  3235. /* under construction !*/
  3236. /* under construction !*/
  3237. /* under construction !*/
  3238. /* under construction !*/
  3239. /* under construction !*/
  3240. /* under construction !*/
  3241. /* under construction !*/
  3242. /* under construction !*/
  3243. /* under construction !*/
  3244. /* under construction !*/
  3245. /* under construction !*/
  3246. /* under construction !*/
  3247. /* under construction !*/
  3248. /* under construction !*/
  3249. /* under construction !*/
  3250. /* under construction !*/
  3251. /* under construction !*/
  3252. /* under construction !*/
  3253. /* under construction !*/
  3254. /* under construction !*/
  3255. /* under construction !*/
  3256. /* under construction !*/
  3257. /* under construction !*/
  3258. /* under construction !*/
  3259. /* under construction !*/
  3260. #if 0
  3261. /* under construction !*/
  3262. /* under construction !*/
  3263. /* under construction !*/
  3264. /* under construction !*/
  3265. #endif
  3266. /* under construction !*/
  3267. /* under construction !*/
  3268. /* under construction !*/
  3269. /* under construction !*/
  3270. /* under construction !*/
  3271. /* under construction !*/
  3272. /* under construction !*/
  3273. /* under construction !*/
  3274. /* under construction !*/
  3275. /* under construction !*/
  3276. /* under construction !*/
  3277. /* under construction !*/
  3278. /* under construction !*/
  3279. /* under construction !*/
  3280. /* under construction !*/
  3281. /* under construction !*/
  3282. /* under construction !*/
  3283. /* under construction !*/
  3284. /* under construction !*/
  3285. /* under construction !*/
  3286. /* under construction !*/
  3287. /* under construction !*/
  3288. /* under construction !*/
  3289. /* under construction !*/
  3290. /* under construction !*/
  3291. /* under construction !*/
  3292. /* under construction !*/
  3293. /* under construction !*/
  3294. /* under construction !*/
  3295. /* under construction !*/
  3296. /* under construction !*/
  3297. /* under construction !*/
  3298. /* under construction !*/
  3299. /* under construction !*/
  3300. /* under construction !*/
  3301. /* under construction !*/
  3302. /* under construction !*/
  3303. /* under construction !*/
  3304. /* under construction !*/
  3305. /* under construction !*/
  3306. /* under construction !*/
  3307. /* under construction !*/
  3308. /* under construction !*/
  3309. /* under construction !*/
  3310. /* under construction !*/
  3311. /* under construction !*/
  3312. /* under construction !*/
  3313. /* under construction !*/
  3314. /* under construction !*/
  3315. /* under construction !*/
  3316. /* under construction !*/
  3317. /* under construction !*/
  3318. /* under construction !*/
  3319. /* under construction !*/
  3320. /* under construction !*/
  3321. /* under construction !*/
  3322. /* under construction !*/
  3323. /* under construction !*/
  3324. #endif /* defined(__MMI_WLAN_OTAP_OMAEXT__) || defined(__MMI_WLAN_OTAP_DMP__) */
  3325. #endif /* defined(__MMI_WLAN_OTAP_OMAEXT__) || defined(__MMI_WLAN_OTAP_DMP__) */