1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
35c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *  Copyright (C) 2010-2013 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the implementation for Type 4 tag in Card Emulation
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  mode.
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_api.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_int.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) /* test only */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN mapping_aid_test_enabled = FALSE;
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8   ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_send_to_lower
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send packet to lower layer
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_to_lower (BT_HDR *p_r_apdu)
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispCET4Tags (p_r_apdu, FALSE);
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (NFC_SendData (NFC_RF_CONN_ID, p_r_apdu) != NFC_STATUS_OK)
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_send_to_lower (): NFC_SendData () failed");
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_send_status
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send status on R-APDU to peer
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_status (UINT16 status)
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_r_apdu;
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_send_status (): Status:0x%04X", status);
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID);
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_r_apdu)
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_send_status (): Cannot allocate buffer");
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, status);
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu->len = T4T_RSP_STATUS_WORDS_SIZE;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!ce_t4t_send_to_lower (p_r_apdu))
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_select_file
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select a file
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_select_file (UINT16 file_id)
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_select_file (): FileID:0x%04X", file_id);
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id == T4T_CC_FILE_ID)
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("ce_t4t_select_file (): Select CC file");
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_CC_FILE_SELECTED;
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id == CE_T4T_MANDATORY_NDEF_FILE_ID)
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG3 ("ce_t4t_select_file (): NLEN:0x%04X, MaxFileSize:0x%04X, WriteAccess:%s",
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->nlen,
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->max_file_size,
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY ? "RW" : "RO"));
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_SELECTED;
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("ce_t4t_select_file (): Cannot find file ID (0x%04X)", file_id);
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_read_binary
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read data from selected file and send R-APDU to peer
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_read_binary (UINT16 offset, UINT8 length)
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p_src = NULL, *p_dst;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_r_apdu;
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG3 ("ce_t4t_read_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X",
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      offset, length, p_t4t->status);
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->status & CE_T4T_STATUS_CC_FILE_SELECTED)
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_src = p_t4t->cc_file;
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED)
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_scratch_buf)
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_src = p_t4t->p_scratch_buf;
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_src = p_t4t->p_ndef_msg;
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_src)
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID);
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!p_r_apdu)
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("ce_t4t_read_binary (): Cannot allocate buffer");
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_dst = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->len = length;
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* add NLEN before NDEF message and adjust offset             */
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if NDEF file is selected and offset < T4T_FILE_LENGTH_SIZE */
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED) && (length > 0))
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (offset == 0)
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT16_TO_BE_STREAM (p_dst, p_t4t->nlen);
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length == 1)
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_dst--;
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else /* length >= 2 */
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length -= T4T_FILE_LENGTH_SIZE;
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (offset == 1)
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT8_TO_BE_STREAM (p_dst, (UINT8) (p_t4t->nlen));
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                offset = 0;
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                length--;
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                offset -= T4T_FILE_LENGTH_SIZE;
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (length > 0)
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_dst, p_src + offset, length);
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dst += length;
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p_dst, T4T_RSP_CMD_CMPLTED);
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->len += T4T_RSP_STATUS_WORDS_SIZE;
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!ce_t4t_send_to_lower (p_r_apdu))
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_read_binary (): No selected file");
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED))
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_update_binary
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Update file and send R-APDU to peer
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_update_binary (UINT16 offset, UINT8 length, UINT8 *p_data)
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        file_length[2];
2685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT16       starting_offset;
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA     ce_data;
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG3 ("ce_t4t_update_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X",
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      offset, length, p_t4t->status);
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    starting_offset = offset;
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update file size (NLEN) */
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0))
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = file_length;
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_t4t->nlen);
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0))
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *(file_length + offset++) = *(p_data++);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            length--;
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = file_length;
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (p_t4t->nlen, p);
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length > 0)
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p_t4t->p_scratch_buf + offset - T4T_FILE_LENGTH_SIZE, p_data, length);
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if this is the last step: writing non-zero length in NLEN */
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((starting_offset == 0) && (p_t4t->nlen > 0))
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_stop_quick_timer (&p_t4t->timer);
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_cb.p_cback)
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.status = NFC_STATUS_OK;
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.length = p_t4t->nlen;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.p_data = p_t4t->p_scratch_buf;
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_CPLT_EVT, &ce_data);
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_update_binary (): Sent CE_T4T_NDEF_UPDATE_CPLT_EVT");
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING);
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (!(p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING))
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* starting of updating */
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_UPDATING;
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_start_quick_timer (&p_t4t->timer, NFC_TTYPE_CE_T4T_UPDATE,
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               (CE_T4T_TOUT_UPDATE * QUICK_TIMER_TICKS_PER_SEC) / 1000);
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_cb.p_cback)
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_START_EVT, NULL);
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!ce_t4t_send_status (T4T_RSP_CMD_CMPLTED))
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_set_version_in_cc
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      update version in CC file
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If reader selects NDEF Tag Application with V1.0 AID then
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  set V1.0 into CC file.
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If reader selects NDEF Tag Application with V2.0 AID then
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  set V2.0 into CC file.
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_set_version_in_cc (UINT8 version)
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_set_version_in_cc (): version = 0x%02X", version);
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file + T4T_VERSION_OFFSET_IN_CC;
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, version);
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_select_file_cmd
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function processes Select Command by file ID.
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_process_select_file_cmd (UINT8 *p_cmd)
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  data_len;
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 file_id, status_words;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_t4t_process_select_file_cmd ()");
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd++; /* skip P2 */
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Lc Byte */
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (data_len, p_cmd);
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (data_len == T4T_FILE_ID_SIZE)
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* File ID */
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (file_id, p_cmd);
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_t4t_select_file (file_id))
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_NOT_FOUND;
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status_words = T4T_RSP_WRONG_LENGTH;
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!ce_t4t_send_status (status_words))
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words == T4T_RSP_CMD_CMPLTED)
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_select_app_cmd
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function processes Select Command by AID.
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_process_select_app_cmd (UINT8 *p_cmd, BT_HDR *p_c_apdu)
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    data_len;
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16   status_words = 0x0000; /* invalid status words */
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA ce_data;
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    xx;
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd ()");
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd++; /* skip P2 */
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Lc Byte */
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (data_len, p_cmd);
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mapping_aid_test_enabled)
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (data_len == T4T_V20_NDEF_TAG_AID_LEN)
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!memcmp(p_cmd, ce_test_tag_app_id, data_len))
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(ce_cb.mem.t4t.p_ndef_msg)  )
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_c_apdu);
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status ((UINT16) T4T_RSP_CMD_CMPLTED);
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Compare AIDs registered by applications
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** if found, use callback of the application
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** otherwise, return error and maintain the same status
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ce_cb.mem.t4t.selected_aid_idx = CE_T4T_MAX_REG_AID;
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (ce_cb.mem.t4t.reg_aid[xx].aid_len > 0)
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(ce_cb.mem.t4t.reg_aid[xx].aid_len == data_len)
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!(memcmp(ce_cb.mem.t4t.reg_aid[xx].aid, p_cmd, data_len)))  )
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.selected_aid_idx = xx;
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if found matched AID */
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ce_cb.mem.t4t.selected_aid_idx < CE_T4T_MAX_REG_AID)
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED);
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED);
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status |= CE_T4T_STATUS_REG_AID_SELECTED;
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG4 ("ce_t4t_process_select_app_cmd (): Registered AID[%02X%02X%02X%02X...] is selected",
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[0],
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[1],
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[2],
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[3]);
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx;
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  (data_len == T4T_V20_NDEF_TAG_AID_LEN)
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&(!memcmp(p_cmd, t4t_v20_ndef_tag_aid, data_len - 1))
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&(ce_cb.mem.t4t.p_ndef_msg)  )
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_cmd += data_len - 1;
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* adjust version if possible */
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((*p_cmd) == 0x00)
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_set_version_in_cc (T4T_VERSION_1_0);
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if ((*p_cmd) == 0x01)
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_set_version_in_cc (T4T_VERSION_2_0);
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID");
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_NOT_FOUND;
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.p_wildcard_aid_cback)
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED);
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED);
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status |= CE_T4T_STATUS_WILDCARD_AID_SELECTED;
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE;
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame (SELECT APP) to wildcard AID handler");
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID or not listening T4T NDEF");
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status_words = T4T_RSP_NOT_FOUND;
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words)
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if T4T CE can support */
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status_words == T4T_RSP_CMD_CMPLTED)
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED);
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED);
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status |= CE_T4T_STATUS_T4T_APP_SELECTED;
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): T4T CE App selected");
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (status_words);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if status_words is not set then upper layer will send R-APDU */
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return;
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_timeout
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ce_t4t_process_timeout (TIMER_LIST_ENT *p_tle)
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA     ce_data;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_process_timeout () event=%d", p_tle->event);
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_tle->event == NFC_TTYPE_CE_T4T_UPDATE)
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING)
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.status = NFC_STATUS_TIMEOUT;
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (ce_cb.p_cback)
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_ABORT_EVT, &ce_data);
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING);
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("ce_t4t_process_timeout () unknown event=%d", p_tle->event);
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_data_cback
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the data from NFCC.
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
6007c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    BT_HDR  *p_c_apdu;
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p_cmd;
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    cla, instruct, select_type = 0, length;
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16   offset, max_file_size;
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA ce_data;
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_DEACTIVATE_CEVT)
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event != NFC_DATA_CEVT)
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    p_c_apdu = (BT_HDR *) p_data->data.p_data;
6177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispCET4Tags (p_c_apdu, TRUE);
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_data_cback (): conn_id = 0x%02X", conn_id);
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Class Byte */
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (cla, p_cmd);
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Don't check class if registered AID has been selected */
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (cla != T4T_CMD_CLASS)
63189996d92bb6f4b73c0f5237e2ec1fdf505843607Martijn Coenen        &&((ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED) == 0)
63289996d92bb6f4b73c0f5237e2ec1fdf505843607Martijn Coenen        &&((ce_cb.mem.t4t.status & CE_T4T_STATUS_WILDCARD_AID_SELECTED) == 0)
63389996d92bb6f4b73c0f5237e2ec1fdf505843607Martijn Coenen       )
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("CET4T: Unsupported Class byte (0x%02X)", cla);
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (T4T_RSP_CLASS_NOT_SUPPORTED);
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Instruction Byte */
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (instruct, p_cmd);
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((cla == T4T_CMD_CLASS) && (instruct == T4T_CMD_INS_SELECT))
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* P1 Byte */
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT8 (select_type, p_cmd);
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (select_type == T4T_CMD_P1_SELECT_BY_NAME)
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_process_select_app_cmd (p_cmd, p_c_apdu);
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if registered AID is selected */
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED)
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to registered AID");
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* forward raw frame to upper layer */
6625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (ce_cb.mem.t4t.selected_aid_idx < CE_T4T_MAX_REG_AID)
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.status = NFC_STATUS_OK;
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.p_data = p_c_apdu;
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx;
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_c_apdu = NULL;
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_c_apdu);
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status (T4T_RSP_NOT_FOUND);
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_WILDCARD_AID_SELECTED)
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to wildcard AID handler");
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* forward raw frame to upper layer */
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE;
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_T4T_APP_SELECTED)
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (instruct == T4T_CMD_INS_SELECT)
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* P1 Byte is already parsed */
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (select_type == T4T_CMD_P1_SELECT_BY_FILE_ID)
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_process_select_file_cmd (p_cmd);
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR1 ("CET4T: Bad P1 byte (0x%02X)", select_type);
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (instruct == T4T_CMD_INS_READ_BINARY)
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED)
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED)  )
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED)
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    max_file_size = T4T_FC_TLV_OFFSET_IN_CC + T4T_FILE_CONTROL_TLV_SIZE;
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    max_file_size = ce_cb.mem.t4t.max_file_size;
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (length, p_cmd); /* Le     */
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check if valid parameters */
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length <= CE_T4T_MAX_LE)
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* CE allows to read more than current file size but not max file size */
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (length + offset > max_file_size)
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (offset < max_file_size)
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            length = (UINT8) (max_file_size - offset);
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            CE_TRACE_DEBUG2 ("CET4T: length is reduced to %d by max_file_size (%d)",
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              length, max_file_size);
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            CE_TRACE_ERROR2 ("CET4T: offset (%d) must be less than max_file_size (%d)",
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              offset, max_file_size);
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            length = 0;
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLe (%d)",
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      length, CE_T4T_MAX_LE);
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length > 0)
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_read_binary (offset, length);
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: File has not been selected");
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (instruct == T4T_CMD_INS_UPDATE_BINARY)
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY)
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: No access right");
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED)
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (length, p_cmd); /* Lc     */
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check if valid parameters */
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length <= CE_T4T_MAX_LC)
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (length + offset > ce_cb.mem.t4t.max_file_size)
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        CE_TRACE_ERROR3 ("CET4T: length (%d) + offset (%d) must be less than max_file_size (%d)",
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                          length, offset, ce_cb.mem.t4t.max_file_size);
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        length = 0;
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLc (%d)",
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      length, CE_T4T_MAX_LC);
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length > 0)
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_update_binary (offset, length, p_cmd);
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: NDEF File has not been selected");
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR1 ("CET4T: Unsupported Instruction byte (0x%02X)", instruct);
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status (T4T_RSP_INSTR_NOT_SUPPORTED);
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CET4T: Application has not been selected");
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_c_apdu)
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_select_t4t
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select Type 4 Tag
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS ce_select_t4t (void)
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_select_t4t ()");
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_stop_quick_timer (&p_t4t->timer);
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* clear other than read-only flag */
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->status &= CE_T4T_STATUS_NDEF_FILE_READ_ONLY;
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_SetStaticRfCback (ce_t4t_data_cback);
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tSetLocalNDEFMsg
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialise CE Type 4 Tag with mandatory NDEF message
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event may be returned
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_START_EVT for starting update
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_CPLT_EVT for complete update
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_ABORT_EVT for failure of update
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_RAW_FRAME_EVT for raw frame
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  read_only:      TRUE if read only
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  ndef_msg_max:   Max NDEF message size
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  ndef_msg_len:   NDEF message size
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_ndef_msg:     NDEF message (excluding NLEN)
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_scratch_buf:  temp storage for update
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4tSetLocalNDEFMsg (BOOLEAN    read_only,
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT16     ndef_msg_max,
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT16     ndef_msg_len,
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8      *p_ndef_msg,
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8      *p_scratch_buf)
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API3 ("CE_T4tSetLocalNDEFMsg () read_only=%d, ndef_msg_max=%d, ndef_msg_len=%d",
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   read_only, ndef_msg_max, ndef_msg_len);
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_ndef_msg)
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->p_ndef_msg = NULL;
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CE_T4tSetLocalNDEFMsg (): T4T is disabled");
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_OK;
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((!read_only) && (!p_scratch_buf))
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tSetLocalNDEFMsg (): p_scratch_buf cannot be NULL if not read-only");
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mapping_aid_test_enabled = FALSE;
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialise CC file */
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file;
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, T4T_CC_FILE_MIN_LEN);
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_MY_VERSION);
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LE);
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LC);
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Mandatory NDEF File Control TLV */
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_NDEF_FILE_CONTROL_TYPE);            /* type */
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FILE_CONTROL_LENGTH);               /* length */
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MANDATORY_NDEF_FILE_ID);         /* file ID */
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, ndef_msg_max + T4T_FILE_LENGTH_SIZE);   /* max NDEF file size */
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FC_READ_ACCESS);                    /* read access */
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (read_only)
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_FC_NO_WRITE_ACCESS);    /* read only */
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_READ_ONLY;
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_FC_WRITE_ACCESS);       /* write access */
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_READ_ONLY);
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* set mandatory NDEF file */
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->p_ndef_msg    = p_ndef_msg;
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->nlen          = ndef_msg_len;
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->max_file_size = ndef_msg_max + T4T_FILE_LENGTH_SIZE;
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize scratch buffer */
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->p_scratch_buf = p_scratch_buf;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_scratch_buf)
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p_scratch_buf, p_ndef_msg, ndef_msg_len);
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tRegisterAID
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register AID in CE T4T
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  aid_len: length of AID (up to NFC_MAX_AID_LEN)
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_aid:   AID
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_cback: Raw frame will be forwarded with CE_RAW_FRAME_EVT
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tCE_T4T_AID_HANDLE if successful,
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  CE_T4T_AID_HANDLE_INVALID otherwisse
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttCE_T4T_AID_HANDLE CE_T4tRegisterAID (UINT8 aid_len, UINT8 *p_aid, tCE_CBACK *p_cback)
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx;
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Handle registering callback for wildcard AID (all AIDs) */
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_len == 0)
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_API0 ("CE_T4tRegisterAID (): registering callback for wildcard AID ");
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if a wildcard callback is already registered (only one is allowed) */
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_wildcard_aid_cback != NULL)
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): only one wildcard AID can be registered at time.");
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return CE_T4T_AID_HANDLE_INVALID;
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered (for wildcard AID)", CE_T4T_WILDCARD_AID_HANDLE);
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->p_wildcard_aid_cback = p_cback;
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_WILDCARD_AID_HANDLE;
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API5 ("CE_T4tRegisterAID () AID [%02X%02X%02X%02X...], %d bytes",
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   *p_aid, *(p_aid+1), *(p_aid+2), *(p_aid+3), aid_len);
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_len > NFC_MAX_AID_LEN)
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("CE_T4tRegisterAID (): AID is up to %d bytes", NFC_MAX_AID_LEN);
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_cback == NULL)
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): callback must be provided");
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_t4t->reg_aid[xx].aid_len == aid_len)
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!(memcmp(p_t4t->reg_aid[xx].aid, p_aid, aid_len)))  )
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): already registered");
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return CE_T4T_AID_HANDLE_INVALID;
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->reg_aid[xx].aid_len == 0)
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->reg_aid[xx].aid_len = aid_len;
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->reg_aid[xx].p_cback = p_cback;
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_t4t->reg_aid[xx].aid, p_aid, aid_len);
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx >= CE_T4T_MAX_REG_AID)
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): No resource");
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered", xx);
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (xx);
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tDeregisterAID
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister AID in CE T4T
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNFC_API extern void CE_T4tDeregisterAID (tCE_T4T_AID_HANDLE aid_handle)
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API1 ("CE_T4tDeregisterAID () handle 0x%02x", aid_handle);
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if deregistering wildcard AID */
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_handle == CE_T4T_WILDCARD_AID_HANDLE)
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_wildcard_aid_cback != NULL)
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->p_wildcard_aid_cback = NULL;
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle");
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Deregister AID */
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((aid_handle >= CE_T4T_MAX_REG_AID) || (p_t4t->reg_aid[aid_handle].aid_len==0))
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle");
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->reg_aid[aid_handle].aid_len = 0;
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->reg_aid[aid_handle].p_cback = NULL;
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4TTestSetCC
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set fields in Capability Container File for testing
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetCC (UINT16 cc_len,
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT8  version,
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT16 max_le,
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT16 max_lc)
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG4 ("CE_T4TTestSetCC (): CCLen:0x%04X, Ver:0x%02X, MaxLe:0x%04X, MaxLc:0x%04X",
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      cc_len, version, max_le, max_lc);
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* CC file */
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file;
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (cc_len != 0xFFFF)
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, cc_len);
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (version != 0xFF)
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mapping_aid_test_enabled = TRUE;
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (version == T4T_VERSION_1_0)
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x00;
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (version == T4T_VERSION_2_0)
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x01;
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else /* Undefined version */
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0xFF;
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, version);
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mapping_aid_test_enabled = FALSE;
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_le != 0xFFFF)
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_le);
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_lc != 0xFFFF)
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_lc);
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_FAILED;
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4TTestSetNDEFCtrlTLV
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set fields in NDEF File Control TLV for testing
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetNDEFCtrlTLV (UINT8  type,
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  length,
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT16 file_id,
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT16 max_file_size,
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  read_access,
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  write_access)
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG6 ("CE_T4TTestSetNDEFCtrlTLV (): type:0x%02X, len:0x%02X, FileID:0x%04X, MaxFile:0x%04X, RdAcc:0x%02X, WrAcc:0x%02X",
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      type, length, file_id, max_file_size, read_access, write_access);
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* NDEF File control TLV */
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file + T4T_FC_TLV_OFFSET_IN_CC;
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (type != 0xFF)
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, type);
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length != 0xFF)
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, length);
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id != 0xFFFF)
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, file_id);
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_file_size != 0xFFFF)
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_file_size);
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (read_access != 0xFF)
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, read_access);
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (write_access != 0xFF)
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, write_access);
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_FAILED;
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_INCLUDED == TRUE */
1204