1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License.
6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at
7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and
14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License.
15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <semaphore.h>
18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <errno.h>
19983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <malloc.h>
20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <time.h>
21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <signal.h>
22983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <string.h>
23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h"
24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h"
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h"
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h"
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Mutex.h"
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "IntervalTimer.h"
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h"
30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h"
312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
322534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedPrimitiveArray.h>
33b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen#include <string>
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C"
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_api.h"
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_rw_api.h"
398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    #include "nfc_brcm_defs.h"
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "ndef_utils.h"
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "rw_api.h"
428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    #include "phNxpExtns.h"
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern nfc_jni_native_data* getNative(JNIEnv *e, jobject o);
47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern bool nfcManager_isNfcActive();
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
50a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern bool         gActivated;
51a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern SyncEvent    gDeactivatedEvent;
52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool    gIsTagDeactivating = false;    // flag for nfa callback indicating we are deactivating for RF interface switch
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool    gIsSelectingRfInterface = false; // flag for nfa callback indicating we are selecting for RF interface switch
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** private variables and functions
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project// Pre-defined tag type values. These must match the values in
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project// framework Ndef.java for Google public NFC API.
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_UNKNOWN_TYPE          -1
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE1_TAG             1
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE2_TAG             2
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE3_TAG             3
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE4_TAG             4
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_MIFARE_CLASSIC_TAG    101
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define STATUS_CODE_TARGET_LOST    146	// this error code comes from the service
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t     sCheckNdefCurrentSize = 0;
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_STATUS  sCheckNdefStatus = 0; //whether tag already contains a NDEF message
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sCheckNdefCapable = false; //whether tag has NDEF capability
88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_HANDLE  sNdefTypeHandlerHandle = NFA_HANDLE_INVALID;
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_INTF_TYPE   sCurrentRfInterface = NFA_INTERFACE_ISO_DEP;
90b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic std::basic_string<UINT8> sRxDataBuffer;
91b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic tNFA_STATUS  sRxDataStatus = NFA_STATUS_OK;
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sWaitingForTransceive = false;
93a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool         sTransceiveRfTimeout = false;
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic Mutex        sRfInterfaceMutex;
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t     sReadDataLen = 0;
96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint8_t*     sReadData = NULL;
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sIsReadingNdefMessage = false;
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent    sReadEvent;
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t        sWriteSem;
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t        sFormatSem;
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent    sTransceiveEvent;
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent    sReconnectEvent;
103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t        sCheckNdefSem;
104b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic SyncEvent    sPresenceCheckEvent;
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t        sMakeReadonlySem;
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic IntervalTimer sSwitchBackTimer; // timer used to tell us to switch back to ISO_DEP frame interface
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sWriteOk = JNI_FALSE;
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sWriteWaitingForComplete = JNI_FALSE;
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sFormatOk = false;
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sConnectOk = JNI_FALSE;
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sConnectWaitingForComplete = JNI_FALSE;
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sGotDeactivate = false;
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t     sCheckNdefMaxSize = 0;
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool         sCheckNdefCardReadOnly = false;
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sCheckNdefWaitingForComplete = JNI_FALSE;
116a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool         sIsTagPresent = true;
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_STATUS  sMakeReadonlyStatus = NFA_STATUS_FAILED;
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean     sMakeReadonlyWaitingForComplete = JNI_FALSE;
119a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int          sCurrentConnectedTargetType = TARGET_TYPE_UNKNOWN;
1208605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic int          sCurrentConnectedTargetProtocol = NFC_PROTOCOL_UNKNOWN;
121a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int reSelect (tNFA_INTF_TYPE rfInterface, bool fSwitchIfNeeded);
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool switchRfInterface(tNFA_INTF_TYPE rfInterface);
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_abortWaits
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Unblock all thread synchronization objects.
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_abortWaits ()
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard g (sReadEvent);
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadEvent.notifyOne ();
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sWriteSem);
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sFormatSem);
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard g (sTransceiveEvent);
145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sTransceiveEvent.notifyOne ();
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard g (sReconnectEvent);
149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReconnectEvent.notifyOne ();
150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sCheckNdefSem);
153b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    {
154b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        SyncEventGuard guard (sPresenceCheckEvent);
155b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        sPresenceCheckEvent.notifyOne ();
156b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    }
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sMakeReadonlySem);
158b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    sCurrentRfInterface = NFA_INTERFACE_ISO_DEP;
159a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sCurrentConnectedTargetType = TARGET_TYPE_UNKNOWN;
1608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sCurrentConnectedTargetProtocol = NFC_PROTOCOL_UNKNOWN;
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doReadCompleted
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of read operation.  Called by
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  NFA_READ_CPLT_EVT.
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  status: Status of operation.
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doReadCompleted (tNFA_STATUS status)
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: status=0x%X; is reading=%u", __FUNCTION__, status, sIsReadingNdefMessage);
177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsReadingNdefMessage == false)
179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return; //not reading NDEF message right now, so just return
180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status != NFA_STATUS_OK)
182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadDataLen = 0;
184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sReadData)
185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            free (sReadData);
186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadData = NULL;
187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard g (sReadEvent);
189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sReadEvent.notifyOne ();
190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function:        nativeNfcTag_setRfInterface
1968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
1978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description:     Set rf interface.
1988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
1998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns:         void
2008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
2018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/
2028605731e8f17d1fde003084811f13f52539eb20cJizhou Liaovoid nativeNfcTag_setRfInterface (tNFA_INTF_TYPE rfInterface)
2038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
2048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sCurrentRfInterface = rfInterface;
2058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
2068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/*******************************************************************************
2098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        ndefHandlerCallback
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive NDEF-message related events from stack.
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  event: Event code.
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  p_data: Event data.
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void ndefHandlerCallback (tNFA_NDEF_EVT event, tNFA_NDEF_EVT_DATA *eventData)
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: event=%u, eventData=%p", __FUNCTION__, event, eventData);
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (event)
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_REGISTER_EVT:
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tNFA_NDEF_REGISTER& ndef_reg = eventData->ndef_reg;
228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_NDEF_REGISTER_EVT; status=0x%X; h=0x%X", __FUNCTION__, ndef_reg.status, ndef_reg.ndef_type_handle);
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNdefTypeHandlerHandle = ndef_reg.ndef_type_handle;
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_DATA_EVT:
234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_NDEF_DATA_EVT; data_len = %lu", __FUNCTION__, eventData->ndef_data.len);
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sReadDataLen = eventData->ndef_data.len;
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sReadData = (uint8_t*) malloc (sReadDataLen);
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            memcpy (sReadData, eventData->ndef_data.p_data, eventData->ndef_data.len);
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Unknown event %u ????", __FUNCTION__, event);
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doRead
252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Read the NDEF message on the tag.
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NDEF message.
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
2602534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jbyteArray nativeNfcTag_doRead (JNIEnv* e, jobject)
261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jbyteArray buf = NULL;
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sReadDataLen = 0;
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sReadData != NULL)
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        free (sReadData);
270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadData = NULL;
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sCheckNdefCurrentSize > 0)
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard g (sReadEvent);
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsReadingNdefMessage = true;
2788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
2798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
2808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = EXTNS_MfcReadNDef ();
2818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
2828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
2838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
2848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = NFA_RwReadNDef ();
2858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sReadEvent.wait (); //wait for NFA_READ_CPLT_EVT
287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sIsReadingNdefMessage = false;
289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sReadDataLen > 0) //if stack actually read data from the tag
291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: read %u bytes", __FUNCTION__, sReadDataLen);
293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            buf = e->NewByteArray (sReadDataLen);
294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            e->SetByteArrayRegion (buf, 0, sReadDataLen, (jbyte*) sReadData);
295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
299b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        ALOGD ("%s: create empty buffer", __FUNCTION__);
300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadDataLen = 0;
301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadData = (uint8_t*) malloc (1);
302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        buf = e->NewByteArray (sReadDataLen);
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->SetByteArrayRegion (buf, 0, sReadDataLen, (jbyte*) sReadData);
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sReadData)
307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        free (sReadData);
309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReadData = NULL;
310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sReadDataLen = 0;
312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return buf;
315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doWriteStatus
321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of write operation.  Called
323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  by NFA_WRITE_CPLT_EVT.
324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isWriteOk: Status of operation.
325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doWriteStatus (jboolean isWriteOk)
330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sWriteWaitingForComplete != JNI_FALSE)
332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sWriteWaitingForComplete = JNI_FALSE;
334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sWriteOk = isWriteOk;
335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sem_post (&sWriteSem);
336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_formatStatus
343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of format operation.  Called
345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  by NFA_FORMAT_CPLT_EVT.
346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isOk: Status of operation.
347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_formatStatus (bool isOk)
352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sFormatOk = isOk;
354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sFormatSem);
355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doWrite
361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Write a NDEF message to the tag.
363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  buf: Contains a NDEF message.
366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
3702534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doWrite (JNIEnv* e, jobject, jbyteArray buf)
371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jboolean result = JNI_FALSE;
373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = 0;
374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const int maxBufferSize = 1024;
375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    UINT8 buffer[maxBufferSize] = { 0 };
376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    UINT32 curDataSize = 0;
377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
3782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedByteArrayRO bytes(e, buf);
3792534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    UINT8* p_data = const_cast<UINT8*>(reinterpret_cast<const UINT8*>(&bytes[0])); // TODO: const-ness API bug in NFA_RwWriteNDef!
380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
3812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ALOGD ("%s: enter; len = %zu", __FUNCTION__, bytes.size());
382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create the write semaphore */
384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_init (&sWriteSem, 0, 0) == -1)
385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno);
387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sWriteWaitingForComplete = JNI_TRUE;
391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sCheckNdefStatus == NFA_STATUS_FAILED)
392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if tag does not contain a NDEF message
394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //and tag is capable of storing NDEF message
395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sCheckNdefCapable)
396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: try format", __FUNCTION__);
398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sem_init (&sFormatSem, 0, 0);
399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sFormatOk = false;
4008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
4018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
4028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
4038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};
4048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = EXTNS_MfcFormatTag (mfc_key1, sizeof(mfc_key1));
4068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (status != NFA_STATUS_OK)
4078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
4088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ALOGE ("%s: can't format mifare classic tag", __FUNCTION__);
4098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    sem_destroy (&sFormatSem);
4108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    goto TheEnd;
4118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
4128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (sFormatOk == false) //if format operation failed
4148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
4158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    sem_wait (&sFormatSem);
4168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    sem_destroy (&sFormatSem);
4178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    sem_init (&sFormatSem, 0, 0);
4188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    status = EXTNS_MfcFormatTag (mfc_key2, sizeof(mfc_key2));
4198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (status != NFA_STATUS_OK)
4208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
4218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ALOGE ("%s: can't format mifare classic tag", __FUNCTION__);
4228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        sem_destroy (&sFormatSem);
4238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        goto TheEnd;
4248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
4258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
4268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
4278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
4288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
4298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = NFA_RwFormatTag ();
4308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sem_wait (&sFormatSem);
432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sem_destroy (&sFormatSem);
433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sFormatOk == false) //if format operation failed
434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                goto TheEnd;
435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: try write", __FUNCTION__);
4372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        status = NFA_RwWriteNDef (p_data, bytes.size());
438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
4392534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    else if (bytes.size() == 0)
440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if (NXP TagWriter wants to erase tag) then create and write an empty ndef message
442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NDEF_MsgInit (buffer, maxBufferSize, &curDataSize);
443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = NDEF_MsgAddRec (buffer, maxBufferSize, &curDataSize, NDEF_TNF_EMPTY, NULL, 0, NULL, 0, NULL, 0);
444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: create empty ndef msg; status=%u; size=%lu", __FUNCTION__, status, curDataSize);
4458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
4468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = EXTNS_MfcWriteNDef (buffer, curDataSize);
4488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
4508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = NFA_RwWriteNDef (buffer, curDataSize);
4528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_RwWriteNDef", __FUNCTION__);
4578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
4588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = EXTNS_MfcWriteNDef (p_data, bytes.size());
4608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
4628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = NFA_RwWriteNDef (p_data, bytes.size());
4648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status != NFA_STATUS_OK)
468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: write/format error=%d", __FUNCTION__, status);
470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Wait for write completion status */
474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sWriteOk = false;
475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_wait (&sWriteSem))
476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: wait semaphore (errno=0x%08x)", __FUNCTION__, errno);
478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    result = sWriteOk;
482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
483525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Destroy semaphore */
485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_destroy (&sWriteSem))
486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: failed destroy semaphore (errno=0x%08x)", __FUNCTION__, errno);
488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sWriteWaitingForComplete = JNI_FALSE;
490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit; result=%d", __FUNCTION__, result);
491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return result;
492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doConnectStatus
498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of connect operation.
500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isConnectOk: Status of the operation.
501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doConnectStatus (jboolean isConnectOk)
506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
5078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (EXTNS_GetConnectFlag () == TRUE)
5088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
5098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        EXTNS_MfcActivated ();
5108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        EXTNS_SetConnectFlag (FALSE);
5118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return;
5128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
5138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sConnectWaitingForComplete != JNI_FALSE)
515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sConnectWaitingForComplete = JNI_FALSE;
517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sConnectOk = isConnectOk;
518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard g (sReconnectEvent);
519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sReconnectEvent.notifyOne ();
520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doDeactivateStatus
527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of deactivate operation.
529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doDeactivateStatus (int status)
534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
5358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (EXTNS_GetDeactivateFlag () == TRUE)
5368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
5378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        EXTNS_MfcDisconnect ();
5388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        EXTNS_SetDeactivateFlag (FALSE);
5398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return;
5408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
5418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sGotDeactivate = (status == 0);
543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard g (sReconnectEvent);
545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sReconnectEvent.notifyOne ();
546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doConnect
552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Connect to the tag in RF field.
554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  targetHandle: Handle of the tag.
557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Must return NXP status code, which NFC service expects.
559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doConnect (JNIEnv*, jobject, jint targetHandle)
562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: targetHandle = %d", __FUNCTION__, targetHandle);
564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int i = targetHandle;
565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag& natTag = NfcTag::getInstance ();
566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int retCode = NFCSTATUS_SUCCESS;
567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (i >= NfcTag::MAX_NUM_TECHNOLOGY)
569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Handle not found", __FUNCTION__);
571525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        retCode = NFCSTATUS_FAILED;
572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (natTag.getActivationState() != NfcTag::Active)
576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: tag already deactivated", __FUNCTION__);
578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        retCode = NFCSTATUS_FAILED;
579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
582a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sCurrentConnectedTargetType = natTag.mTechList[i];
5838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sCurrentConnectedTargetProtocol = natTag.mTechLibNfcTypes[i];
5848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol != NFC_PROTOCOL_ISO_DEP)
586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
5878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGD ("%s() Nfc type = %d, do nothing for non ISO_DEP", __FUNCTION__, sCurrentConnectedTargetProtocol);
588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        retCode = NFCSTATUS_SUCCESS;
589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetType == TARGET_TYPE_ISO14443_3A || sCurrentConnectedTargetType == TARGET_TYPE_ISO14443_3B)
593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
5948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGD ("%s: switching to tech: %d need to switch rf intf to frame", __FUNCTION__, sCurrentConnectedTargetType);
595133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen        retCode = switchRfInterface(NFA_INTERFACE_FRAME) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
599133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen        retCode = switchRfInterface(NFA_INTERFACE_ISO_DEP) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
602525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit 0x%X", __FUNCTION__, retCode);
604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return retCode;
605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        reSelect
611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Deactivates the tag and re-selects it with the specified
613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rf interface.
614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         status code, 0 on success, 1 on failure,
616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  146 (defined in service) on tag lost
617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
619a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int reSelect (tNFA_INTF_TYPE rfInterface, bool fSwitchIfNeeded)
620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
621a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: enter; rf intf = %d, current intf = %d", __FUNCTION__, rfInterface, sCurrentRfInterface);
622a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
623a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sRfInterfaceMutex.lock ();
624a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
625a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (fSwitchIfNeeded && (rfInterface == sCurrentRfInterface))
626a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
627a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        // already in the requested interface
628a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        sRfInterfaceMutex.unlock ();
629a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        return 0;   // success
630a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
631a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag& natTag = NfcTag::getInstance ();
633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status;
635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int rVal = 1;
636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    do
638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if tag has shutdown, abort this method
640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().isNdefDetectionTimedOut())
641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: ndef detection timeout; break", __FUNCTION__);
643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            rVal = STATUS_CODE_TARGET_LOST;
644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard g (sReconnectEvent);
649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            gIsTagDeactivating = true;
650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sGotDeactivate = false;
651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: deactivate to sleep", __FUNCTION__);
652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (NFA_STATUS_OK != (status = NFA_Deactivate (TRUE))) //deactivate to sleep state
653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: deactivate failed, status = %d", __FUNCTION__, status);
655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                break;
656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sReconnectEvent.wait (1000) == false) //if timeout occurred
659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: timeout waiting for deactivate", __FUNCTION__);
661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
664a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        if (!sGotDeactivate)
665a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        {
666a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            rVal = STATUS_CODE_TARGET_LOST;
667a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            break;
668a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        }
669a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().getActivationState () != NfcTag::Sleep)
671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
672b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            ALOGE ("%s: tag is not in sleep", __FUNCTION__);
673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            rVal = STATUS_CODE_TARGET_LOST;
674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        gIsTagDeactivating = false;
678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard g2 (sReconnectEvent);
681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sConnectWaitingForComplete = JNI_TRUE;
683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: select interface %u", __FUNCTION__, rfInterface);
684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            gIsSelectingRfInterface = true;
685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (NFA_STATUS_OK != (status = NFA_Select (natTag.mTechHandles[0], natTag.mTechLibNfcTypes[0], rfInterface)))
686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: NFA_Select failed, status = %d", __FUNCTION__, status);
688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                break;
689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sConnectOk = false;
692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sReconnectEvent.wait (1000) == false) //if timeout occured
693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: timeout waiting for select", __FUNCTION__);
695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                break;
696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: select completed; sConnectOk=%d", __FUNCTION__, sConnectOk);
700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().getActivationState () != NfcTag::Active)
701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
702b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            ALOGE("%s: tag is not active", __FUNCTION__);
703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            rVal = STATUS_CODE_TARGET_LOST;
704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
706a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        if (sConnectOk)
707a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        {
708a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            rVal = 0;   // success
709a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            sCurrentRfInterface = rfInterface;
710a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        }
711a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        else
712a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        {
713a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            rVal = 1;
714a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        }
715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    } while (0);
716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sConnectWaitingForComplete = JNI_FALSE;
718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    gIsTagDeactivating = false;
719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    gIsSelectingRfInterface = false;
720a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sRfInterfaceMutex.unlock ();
721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit; status=%d", __FUNCTION__, rVal);
722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return rVal;
723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        switchRfInterface
728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Switch controller's RF interface to frame, ISO-DEP, or NFC-DEP.
730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rfInterface: Type of RF interface.
731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool switchRfInterface (tNFA_INTF_TYPE rfInterface)
736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag& natTag = NfcTag::getInstance ();
738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
7398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol != NFC_PROTOCOL_ISO_DEP)
740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: protocol: %d not ISO_DEP, do nothing", __FUNCTION__, natTag.mTechLibNfcTypes[0]);
742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return true;
743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: new rf intf = %d, cur rf intf = %d", __FUNCTION__, rfInterface, sCurrentRfInterface);
746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
747a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    return (0 == reSelect(rfInterface, true));
748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doReconnect
754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Re-connect to the tag in RF field.
756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status code.
760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
7622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doReconnect (JNIEnv*, jobject)
763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int retCode = NFCSTATUS_SUCCESS;
766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag& natTag = NfcTag::getInstance ();
767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (natTag.getActivationState() != NfcTag::Active)
769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: tag already deactivated", __FUNCTION__);
771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        retCode = NFCSTATUS_FAILED;
772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
775218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    // special case for Kovio
7768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE)
777218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    {
778218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        ALOGD ("%s: fake out reconnect for Kovio", __FUNCTION__);
779218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        goto TheEnd;
780218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    }
781218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen
782133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen     // this is only supported for type 2 or 4 (ISO_DEP) tags
7838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_ISO_DEP)
7848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        retCode = reSelect (NFA_INTERFACE_ISO_DEP, false);
7858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_T2T)
7868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        retCode = reSelect (NFA_INTERFACE_FRAME, false);
7878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
7888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        retCode = reSelect (NFA_INTERFACE_MIFARE, false);
789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
790525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit 0x%X", __FUNCTION__, retCode);
792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return retCode;
793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doHandleReconnect
799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Re-connect to the tag in RF field.
801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  targetHandle: Handle of the tag.
804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status code.
806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint nativeNfcTag_doHandleReconnect (JNIEnv *e, jobject o, jint targetHandle)
809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: targetHandle = %d", __FUNCTION__, targetHandle);
811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return nativeNfcTag_doConnect (e, o, targetHandle);
812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doDisconnect
818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Deactivate the RF field.
820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
8262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doDisconnect (JNIEnv*, jobject)
827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS nfaStat = NFA_STATUS_OK;
830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
831a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcTag::getInstance().resetAllTransceiveTimeouts ();
832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (NfcTag::getInstance ().getActivationState () != NfcTag::Active)
834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: tag already deactivated", __FUNCTION__);
836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nfaStat = NFA_Deactivate (FALSE);
840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfaStat != NFA_STATUS_OK)
841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, nfaStat);
842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
843525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return (nfaStat == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE;
846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doTransceiveStatus
852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the completion status of transceive operation.
854b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen**                  status: operation status.
855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  buf: Contains tag's response.
856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  bufLen: Length of buffer.
857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
861b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenvoid nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t* buf, uint32_t bufLen)
862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
863a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    SyncEventGuard g (sTransceiveEvent);
864b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    ALOGD ("%s: data len=%d", __FUNCTION__, bufLen);
8658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
8678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
8688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       if (EXTNS_GetCallBackFlag () == FALSE)
8698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       {
8708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           EXTNS_MfcCallBack (buf, bufLen);
8718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           return;
8728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       }
8738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
8748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (!sWaitingForTransceive)
876b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    {
877b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        ALOGE ("%s: drop data", __FUNCTION__);
878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
879b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    }
880b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    sRxDataStatus = status;
881133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    if (sRxDataStatus == NFA_STATUS_OK || sRxDataStatus == NFA_STATUS_CONTINUE)
882133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen        sRxDataBuffer.append (buf, bufLen);
883133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen
884133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen    if (sRxDataStatus == NFA_STATUS_OK)
885b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        sTransceiveEvent.notifyOne ();
886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
889a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid nativeNfcTag_notifyRfTimeout ()
890a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{
891a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    SyncEventGuard g (sTransceiveEvent);
892a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: waiting for transceive: %d", __FUNCTION__, sWaitingForTransceive);
893a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (!sWaitingForTransceive)
894a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        return;
895a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
896a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sTransceiveRfTimeout = true;
897a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
898a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sTransceiveEvent.notifyOne ();
899a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu}
900b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
901b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen
902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doTransceive
905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Send raw data to the tag; receive tag's response.
907525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
908525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  raw: Not used.
910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  statusTargetLost: Whether tag responds or times out.
911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Response from tag.
913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
9158605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject o, jbyteArray data, jboolean raw, jintArray statusTargetLost)
916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
917b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    int timeout = NfcTag::getInstance ().getTransceiveTimeout (sCurrentConnectedTargetType);
918a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: enter; raw=%u; timeout = %d", __FUNCTION__, raw, timeout);
9198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
920525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool waitOk = false;
921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool isNack = false;
922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jint *targetLost = NULL;
9238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    tNFA_STATUS status;
924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (NfcTag::getInstance ().getActivationState () != NfcTag::Active)
926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (statusTargetLost)
928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            targetLost = e->GetIntArrayElements (statusTargetLost, 0);
930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (targetLost)
931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                *targetLost = 1; //causes NFC service to throw TagLostException
932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            e->ReleaseIntArrayElements (statusTargetLost, targetLost, 0);
933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: tag not active", __FUNCTION__);
935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag& natTag = NfcTag::getInstance ();
939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // get input buffer and length from java call
9412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedByteArrayRO bytes(e, data);
9422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); // TODO: API bug; NFA_SendRawFrame should take const*!
9432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    size_t bufLen = bytes.size();
944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (statusTargetLost)
946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        targetLost = e->GetIntArrayElements (statusTargetLost, 0);
948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (targetLost)
949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            *targetLost = 0; //success, tag is still present
950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sSwitchBackTimer.kill ();
9532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jbyteArray> result(e, NULL);
954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    do
955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard g (sTransceiveEvent);
958a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            sTransceiveRfTimeout = false;
959a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            sWaitingForTransceive = true;
960b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            sRxDataStatus = NFA_STATUS_OK;
961b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            sRxDataBuffer.clear ();
9628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
9648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
9658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = EXTNS_MfcTransceive (buf, bufLen);
9668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
9678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
9688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
9698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = NFA_SendRawFrame (buf, bufLen,
9708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY);
9718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
9728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (status != NFA_STATUS_OK)
974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: fail send; error=%d", __FUNCTION__, status);
976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                break;
977525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
978a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            waitOk = sTransceiveEvent.wait (timeout);
979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
981a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        if (waitOk == false || sTransceiveRfTimeout) //if timeout occurred
982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: wait response timeout", __FUNCTION__);
984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (targetLost)
985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                *targetLost = 1; //causes NFC service to throw TagLostException
986525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
987525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
989525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().getActivationState () != NfcTag::Active)
990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: already deactivated", __FUNCTION__);
992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (targetLost)
993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                *targetLost = 1; //causes NFC service to throw TagLostException
994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9971a751c9459bf1c43aa4bdd3da4a2c9f35a1c8d4bAurimas Liutikas        ALOGD ("%s: response %zu bytes", __FUNCTION__, sRxDataBuffer.size());
998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((natTag.getProtocol () == NFA_PROTOCOL_T2T) &&
1000705ca580725b89b63aff0a14762024b0f2c73883Evan Chu            natTag.isT2tNackResponse (sRxDataBuffer.data(), sRxDataBuffer.size()))
1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            isNack = true;
1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1005b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        if (sRxDataBuffer.size() > 0)
1006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1007b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            if (isNack)
1008b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            {
1009b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                //Some Mifare Ultralight C tags enter the HALT state after it
1010b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                //responds with a NACK.  Need to perform a "reconnect" operation
1011b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                //to wake it.
1012b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                ALOGD ("%s: try reconnect", __FUNCTION__);
1013b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                nativeNfcTag_doReconnect (NULL, NULL);
1014b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                ALOGD ("%s: reconnect finish", __FUNCTION__);
1015b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            }
10168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
10178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
10188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                uint32_t transDataLen = sRxDataBuffer.size ();
10198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                uint8_t *transData = (uint8_t *) sRxDataBuffer.data ();
10208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (EXTNS_CheckMfcResponse (&transData, &transDataLen) == NFCSTATUS_FAILED)
10218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
10228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    nativeNfcTag_doReconnect (e, o);
10238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
10248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
10258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
10268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (transDataLen != 0)
10278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
10288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        result.reset (e->NewByteArray (transDataLen));
10298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
10308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (result.get () != NULL)
10318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
10328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        e->SetByteArrayRegion (result.get (), 0, transDataLen, (const jbyte *) transData);
10338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
10348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    else
10358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__);
10368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
10378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
1038b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            else
1039b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            {
1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // marshall data to java for return
1041b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                result.reset(e->NewByteArray(sRxDataBuffer.size()));
1042b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                if (result.get() != NULL)
1043b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                {
1044705ca580725b89b63aff0a14762024b0f2c73883Evan Chu                    e->SetByteArrayRegion(result.get(), 0, sRxDataBuffer.size(), (const jbyte *) sRxDataBuffer.data());
1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                else
1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__);
1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } // else a nack is treated as a transceive failure to the upper layers
1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1050b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            sRxDataBuffer.clear();
1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    } while (0);
1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sWaitingForTransceive = false;
1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (targetLost)
1056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ReleaseIntArrayElements (statusTargetLost, targetLost, 0);
1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
10592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    return result.release();
1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1064525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1065525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doGetNdefType
1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Retrieve the type of tag.
1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  libnfcType: Type of tag represented by JNI.
1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  javaType: Not used.
1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Type of tag represented by NFC Service.
1074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
10762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doGetNdefType (JNIEnv*, jobject, jint libnfcType, jint javaType)
1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; libnfc type=%d; java type=%d", __FUNCTION__, libnfcType, javaType);
1079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jint ndefType = NDEF_UNKNOWN_TYPE;
1080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // For NFA, libnfcType is mapped to the protocol value received
1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // in the NFA_ACTIVATED_EVT and NFA_DISC_RESULT_EVT event.
10838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NFA_PROTOCOL_T1T == libnfcType)
10848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndefType = NDEF_TYPE1_TAG;
10868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NFA_PROTOCOL_T2T == libnfcType)
10888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
10898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ndefType = NDEF_TYPE2_TAG;
10908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NFA_PROTOCOL_T3T == libnfcType)
10928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndefType = NDEF_TYPE3_TAG;
10948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NFA_PROTOCOL_ISO_DEP == libnfcType)
10968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndefType = NDEF_TYPE4_TAG;
10988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NFA_PROTOCOL_MIFARE == libnfcType)
11008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
11018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ndefType = NDEF_MIFARE_CLASSIC_TAG;
11028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
11038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
11048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
11058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* NFA_PROTOCOL_ISO15693, NFA_PROTOCOL_INVALID and others */
1106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndefType = NDEF_UNKNOWN_TYPE;
1107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit; ndef type=%d", __FUNCTION__, ndefType);
1109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return ndefType;
1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doCheckNdefResult
1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the result of checking whether the tag contains a NDEF
1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  message.  Called by the NFA_NDEF_DETECT_EVT.
1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  status: Status of the operation.
1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  maxSize: Maximum size of NDEF message.
1121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  currentSize: Current size of NDEF message.
1122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  flags: Indicate various states.
1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t maxSize, uint32_t currentSize, uint8_t flags)
1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //this function's flags parameter is defined using the following macros
1130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //in nfc/include/rw_api.h;
1131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //#define RW_NDEF_FL_READ_ONLY  0x01    /* Tag is read only              */
1132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //#define RW_NDEF_FL_FORMATED   0x02    /* Tag formated for NDEF         */
1133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //#define RW_NDEF_FL_SUPPORTED  0x04    /* NDEF supported by the tag     */
1134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //#define RW_NDEF_FL_UNKNOWN    0x08    /* Unable to find if tag is ndef capable/formated/read only */
1135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //#define RW_NDEF_FL_FORMATABLE 0x10    /* Tag supports format operation */
1136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (!sCheckNdefWaitingForComplete)
1138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: not waiting", __FUNCTION__);
1140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
1141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (flags & RW_NDEF_FL_READ_ONLY)
1144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: flag read-only", __FUNCTION__);
1145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (flags & RW_NDEF_FL_FORMATED)
1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: flag formatted for ndef", __FUNCTION__);
1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (flags & RW_NDEF_FL_SUPPORTED)
1148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: flag ndef supported", __FUNCTION__);
1149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (flags & RW_NDEF_FL_UNKNOWN)
1150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: flag all unknown", __FUNCTION__);
1151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (flags & RW_NDEF_FL_FORMATABLE)
1152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: flag formattable", __FUNCTION__);
1153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sCheckNdefWaitingForComplete = JNI_FALSE;
1155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sCheckNdefStatus = status;
1156b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    if (sCheckNdefStatus != NFA_STATUS_OK && sCheckNdefStatus != NFA_STATUS_TIMEOUT)
1157b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        sCheckNdefStatus = NFA_STATUS_FAILED;
1158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sCheckNdefCapable = false; //assume tag is NOT ndef capable
1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sCheckNdefStatus == NFA_STATUS_OK)
1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //NDEF content is on the tag
1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefMaxSize = maxSize;
1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCurrentSize = currentSize;
1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCardReadOnly = flags & RW_NDEF_FL_READ_ONLY;
1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCapable = true;
1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else if (sCheckNdefStatus == NFA_STATUS_FAILED)
1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //no NDEF content on the tag
1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefMaxSize = 0;
1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCurrentSize = 0;
1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCardReadOnly = flags & RW_NDEF_FL_READ_ONLY;
1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((flags & RW_NDEF_FL_UNKNOWN) == 0) //if stack understands the tag
1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (flags & RW_NDEF_FL_SUPPORTED) //if tag is ndef capable
1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sCheckNdefCapable = true;
1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: unknown status=0x%X", __FUNCTION__, status);
1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefMaxSize = 0;
1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCurrentSize = 0;
1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCheckNdefCardReadOnly = false;
1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_post (&sCheckNdefSem);
1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doCheckNdef
1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Does the tag contain a NDEF message?
1195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  ndefInfo: NDEF info.
1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status code; 0 is success.
1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12028605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jint nativeNfcTag_doCheckNdef (JNIEnv* e, jobject o, jintArray ndefInfo)
1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jint* ndef = NULL;
1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
120997a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu    // special case for Kovio
12108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE)
121197a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu    {
121297a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        ALOGD ("%s: Kovio tag, no NDEF", __FUNCTION__);
121397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        ndef = e->GetIntArrayElements (ndefInfo, 0);
121497a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        ndef[0] = 0;
121597a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        ndef[1] = NDEF_MODE_READ_ONLY;
121697a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        e->ReleaseIntArrayElements (ndefInfo, ndef, 0);
121797a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu        return NFA_STATUS_FAILED;
121897a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu    }
12198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
12208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        nativeNfcTag_doReconnect (e, o);
12228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
122397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu
1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create the write semaphore */
1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_init (&sCheckNdefSem, 0, 0) == -1)
1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Check NDEF semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno);
1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (NfcTag::getInstance ().getActivationState () != NfcTag::Active)
1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: tag already deactivated", __FUNCTION__);
1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: try NFA_RwDetectNDef", __FUNCTION__);
1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sCheckNdefWaitingForComplete = JNI_TRUE;
12398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
12418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = EXTNS_MfcCheckNDef ();
12438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
12448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
12458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = NFA_RwDetectNDef ();
12478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status != NFA_STATUS_OK)
1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: NFA_RwDetectNDef failed, status = 0x%X", __FUNCTION__, status);
1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Wait for check NDEF completion status */
1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_wait (&sCheckNdefSem))
1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to wait for check NDEF semaphore (errno=0x%08x)", __FUNCTION__, errno);
1259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sCheckNdefStatus == NFA_STATUS_OK)
1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //stack found a NDEF message on the tag
1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndef = e->GetIntArrayElements (ndefInfo, 0);
1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().getProtocol () == NFA_PROTOCOL_T1T)
1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[0] = NfcTag::getInstance ().getT1tMaxMessageSize ();
1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[0] = sCheckNdefMaxSize;
1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sCheckNdefCardReadOnly)
1271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[1] = NDEF_MODE_READ_ONLY;
1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[1] = NDEF_MODE_READ_WRITE;
1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ReleaseIntArrayElements (ndefInfo, ndef, 0);
1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = NFA_STATUS_OK;
1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else if (sCheckNdefStatus == NFA_STATUS_FAILED)
1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //stack did not find a NDEF message on the tag;
1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ndef = e->GetIntArrayElements (ndefInfo, 0);
1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (NfcTag::getInstance ().getProtocol () == NFA_PROTOCOL_T1T)
1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[0] = NfcTag::getInstance ().getT1tMaxMessageSize ();
1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[0] = sCheckNdefMaxSize;
1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sCheckNdefCardReadOnly)
1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[1] = NDEF_MODE_READ_ONLY;
1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ndef[1] = NDEF_MODE_READ_WRITE;
1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ReleaseIntArrayElements (ndefInfo, ndef, 0);
1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = NFA_STATUS_FAILED;
1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
12923c5b92be7ed8260754a447268c2c2fbfc780582aEvan Chu    else if ((sCheckNdefStatus == NFA_STATUS_TIMEOUT) && (NfcTag::getInstance ().getProtocol() == NFC_PROTOCOL_ISO_DEP))
1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        pn544InteropStopPolling ();
1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = sCheckNdefStatus;
1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: unknown status 0x%X", __FUNCTION__, sCheckNdefStatus);
1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = sCheckNdefStatus;
1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
13038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Reconnect Mifare Classic Tag for furture use */
13048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
13058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        nativeNfcTag_doReconnect (e, o);
13078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
13088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Destroy semaphore */
1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_destroy (&sCheckNdefSem))
1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to destroy check NDEF semaphore (errno=0x%08x)", __FUNCTION__, errno);
1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sCheckNdefWaitingForComplete = JNI_FALSE;
1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit; status=0x%X", __FUNCTION__, status);
1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return status;
1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_resetPresenceCheck
1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Reset variables related to presence-check.
1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_resetPresenceCheck ()
1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1332a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sIsTagPresent = true;
1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doPresenceCheckResult
1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the result of presence-check.
1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  status: Result of presence-check.
1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status)
1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1348b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    SyncEventGuard guard (sPresenceCheckEvent);
1349a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sIsTagPresent = status == NFA_STATUS_OK;
1350b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    sPresenceCheckEvent.notifyOne ();
1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doPresenceCheck
1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Check if the tag is in the RF field.
1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if tag is in RF field.
1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doPresenceCheck (JNIEnv*, jobject)
1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_OK;
1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jboolean isPresent = JNI_FALSE;
1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1371218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    // Special case for Kovio.  The deactivation would have already occurred
1372218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    // but was ignored so that normal tag opertions could complete.  Now we
1373218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    // want to process as if the deactivate just happened.
13748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE)
1375218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    {
1376218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__);
1377218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE};
1378a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        {
1379a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            SyncEventGuard g (gDeactivatedEvent);
1380a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            gActivated = false; //guard this variable from multi-threaded access
1381a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            gDeactivatedEvent.notifyOne ();
1382a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        }
1383218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen
1384218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        NfcTag::getInstance().setDeactivationState (deactivated);
1385218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        nativeNfcTag_resetPresenceCheck();
1386218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL);
1387218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        nativeNfcTag_abortWaits();
1388218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        NfcTag::getInstance().abort ();
1389218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen
1390218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen        return JNI_FALSE;
1391218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen    }
1392218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen
1393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfcManager_isNfcActive() == false)
1394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFC is no longer active.", __FUNCTION__);
1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1399a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (!sRfInterfaceMutex.tryLock())
1400a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
1401a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD ("%s: tag is being reSelected assume it is present", __FUNCTION__);
1402a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        return JNI_TRUE;
1403a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
1404a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1405a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    sRfInterfaceMutex.unlock();
1406a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1407a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (NfcTag::getInstance ().isActivated () == false)
1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: tag already deactivated", __FUNCTION__);
1410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
14128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
14138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
14148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = EXTNS_MfcPresenceCheck ();
14158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (status == NFCSTATUS_SUCCESS)
14168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            return (NFCSTATUS_SUCCESS == EXTNS_GetPresenceCheckStatus ()) ? JNI_TRUE : JNI_FALSE;
14188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1422b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        SyncEventGuard guard (sPresenceCheckEvent);
1423b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        status = NFA_RwPresenceCheck (NfcTag::getInstance().getPresenceCheckAlgorithm());
1424b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        if (status == NFA_STATUS_OK)
1425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1426b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen            sPresenceCheckEvent.wait ();
1427a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            isPresent = sIsTagPresent ? JNI_TRUE : JNI_FALSE;
1428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (isPresent == JNI_FALSE)
1432a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD ("%s: tag absent", __FUNCTION__);
1433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return isPresent;
1434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doIsNdefFormatable
1440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Can tag be formatted to store NDEF message?
1442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  libNfcType: Type of tag.
1445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  uidBytes: Tag's unique ID.
1446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  pollBytes: Data from activation.
1447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  actBytes: Data from activation.
1448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if formattable.
1450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1452fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liaostatic jboolean nativeNfcTag_doIsNdefFormatable (JNIEnv* e,
1453fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        jobject o, jint /*libNfcType*/, jbyteArray, jbyteArray,
14542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        jbyteArray)
1455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jboolean isFormattable = JNI_FALSE;
145726e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    tNFC_PROTOCOL protocol = NfcTag::getInstance().getProtocol();
14588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NFA_PROTOCOL_T1T == protocol || NFA_PROTOCOL_ISO15693 == protocol
14598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        || NFA_PROTOCOL_MIFARE == protocol)
1460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        isFormattable = JNI_TRUE;
146226e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    }
146326e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    else if (NFA_PROTOCOL_T3T == protocol)
146426e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    {
1465b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        isFormattable = NfcTag::getInstance().isFelicaLite() ? JNI_TRUE : JNI_FALSE;
146626e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    }
146726e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    else if (NFA_PROTOCOL_T2T == protocol)
146826e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao    {
1469b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        isFormattable = ( NfcTag::getInstance().isMifareUltralight() |
1470b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                          NfcTag::getInstance().isInfineonMyDMove() |
1471b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                          NfcTag::getInstance().isKovioType2Tag() )
1472b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen                        ? JNI_TRUE : JNI_FALSE;
1473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1474fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao    else if (NFA_PROTOCOL_ISO_DEP == protocol)
1475fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao    {
1476fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        /**
1477fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao         * Determines whether this is a formatable IsoDep tag - currectly only NXP DESFire
1478fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao         * is supported.
1479fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao         */
1480fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        uint8_t cmd[] = {0x90, 0x60, 0x00, 0x00, 0x00};
1481fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao
1482fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        if (NfcTag::getInstance ().isMifareDESFire ())
1483fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        {
1484fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            /* Identifies as DESfire, use get version cmd to be sure */
1485fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            jbyteArray versionCmd = e->NewByteArray (5);
1486fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            e->SetByteArrayRegion (versionCmd, 0, 5, (jbyte*) cmd);
1487fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            jbyteArray respBytes = nativeNfcTag_doTransceive(e, o, versionCmd, JNI_TRUE, NULL);
1488fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            if (respBytes != NULL)
1489fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            {
1490fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // Check whether the response matches a typical DESfire
1491fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // response.
1492fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // libNFC even does more advanced checking than we do
1493fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // here, and will only format DESfire's with a certain
1494fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // major/minor sw version and NXP as a manufacturer.
1495fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // We don't want to do such checking here, to avoid
1496fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // having to change code in multiple places.
1497fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // A succesful (wrapped) DESFire getVersion command returns
1498fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // 9 bytes, with byte 7 0x91 and byte 8 having status
1499fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                // code 0xAF (these values are fixed and well-known).
1500fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                int respLength = e->GetArrayLength (respBytes);
1501fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                uint8_t* resp = (uint8_t*) e->GetByteArrayElements (respBytes, NULL);
1502fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                if (respLength == 9 && resp[7] == 0x91 && resp[8] == 0xAF)
1503fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                {
1504fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                    isFormattable = JNI_TRUE;
1505fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                }
1506fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao                e->ReleaseByteArrayElements (respBytes, (jbyte *) resp, JNI_ABORT);
1507fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao            }
1508fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        }
1509fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao    }
151026e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao
1511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s: is formattable=%u", __FUNCTION__, isFormattable);
1512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return isFormattable;
1513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doIsIsoDepNdefFormatable
1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Is ISO-DEP tag formattable?
1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  pollBytes: Data from activation.
1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  actBytes: Data from activation.
1525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if formattable.
1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nativeNfcTag_doIsIsoDepNdefFormatable (JNIEnv *e, jobject o, jbyteArray pollBytes, jbyteArray actBytes)
1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    uint8_t uidFake[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jbyteArray uidArray = e->NewByteArray (8);
1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetByteArrayRegion (uidArray, 0, 8, (jbyte*) uidFake);
1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return nativeNfcTag_doIsNdefFormatable (e, o, 0, uidArray, pollBytes, actBytes);
1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
15418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function:        nativeNfcTag_makeMifareNdefFormat
15428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
15438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description:     Format a mifare classic tag so it can store NDEF message.
15448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  e: JVM environment.
15458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  o: Java object.
15468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  key: Key to acces tag.
15478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  keySize: size of Key.
15488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
15498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns:         True if ok.
15508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
15518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/
15528605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_makeMifareNdefFormat (JNIEnv *e, jobject o, uint8_t *key, uint32_t keySize)
15538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
15548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    ALOGD ("%s: enter", __FUNCTION__);
15558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    tNFA_STATUS status = NFA_STATUS_OK;
15568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    status = nativeNfcTag_doReconnect (e, o);
15588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (status != NFA_STATUS_OK)
15598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
15608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGD ("%s: reconnect error, status=%u", __FUNCTION__, status);
15618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return JNI_FALSE;
15628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
15638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sem_init (&sFormatSem, 0, 0);
15658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sFormatOk = false;
15668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    status = EXTNS_MfcFormatTag (key, keySize);
15688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (status == NFA_STATUS_OK)
15708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
15718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGD ("%s: wait for completion", __FUNCTION__);
15728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sem_wait (&sFormatSem);
15738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = sFormatOk ? NFA_STATUS_OK : NFA_STATUS_FAILED;
15748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
15758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
15768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
15778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGE ("%s: error status=%u", __FUNCTION__, status);
15788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
15798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sem_destroy (&sFormatSem);
15818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    ALOGD ("%s: exit", __FUNCTION__);
15828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return (status == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE;
15838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
15848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/*******************************************************************************
15878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
1588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doNdefFormat
1589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Format a tag so it can store NDEF message.
1591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  key: Not used.
1594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1598fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liaostatic jboolean nativeNfcTag_doNdefFormat (JNIEnv *e, jobject o, jbyteArray)
1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_OK;
1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1603a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    // Do not try to format if tag is already deactivated.
1604a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (NfcTag::getInstance ().isActivated () == false)
1605a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
1606a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD ("%s: tag already deactivated(no need to format)", __FUNCTION__);
1607a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        return JNI_FALSE;
1608a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
1609a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
16108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
16118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
16138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};
16148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        jboolean result;
16158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        result = nativeNfcTag_makeMifareNdefFormat (e, o, mfc_key1, sizeof(mfc_key1));
16178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (result == JNI_FALSE)
16188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
16198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            result = nativeNfcTag_makeMifareNdefFormat (e, o, mfc_key2, sizeof(mfc_key2));
16208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
16218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return result;
16228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_init (&sFormatSem, 0, 0);
1625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sFormatOk = false;
1626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    status = NFA_RwFormatTag ();
1627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status == NFA_STATUS_OK)
1628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: wait for completion", __FUNCTION__);
1630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sem_wait (&sFormatSem);
1631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = sFormatOk ? NFA_STATUS_OK : NFA_STATUS_FAILED;
1632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: error status=%u", __FUNCTION__, status);
1635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sem_destroy (&sFormatSem);
1636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
16378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_ISO_DEP)
1638fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao    {
1639fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        int retCode = NFCSTATUS_SUCCESS;
1640fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao        retCode = nativeNfcTag_doReconnect (e, o);
1641fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao    }
1642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return (status == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE;
1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doMakeReadonlyResult
1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive the result of making a tag read-only. Called by the
1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  NFA_SET_TAG_RO_EVT.
1653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  status: Status of the operation.
1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status)
1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sMakeReadonlyWaitingForComplete != JNI_FALSE)
1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sMakeReadonlyWaitingForComplete = JNI_FALSE;
1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sMakeReadonlyStatus = status;
1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sem_post (&sMakeReadonlySem);
1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
16728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function:        nativeNfcTag_makeMifareReadonly
16738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
16748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description:     Make the mifare classic tag read-only.
16758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  e: JVM environment.
16768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  o: Java object.
16778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  key: Key to access the tag.
16788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**                  keySize: size of Key.
16798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
16808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns:         True if ok.
16818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
16828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/
16838605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_makeMifareReadonly (JNIEnv *e, jobject o, uint8_t *key, int32_t keySize)
16848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
16858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    jboolean result = JNI_FALSE;
16868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    tNFA_STATUS status = NFA_STATUS_OK;
16878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sMakeReadonlyStatus = NFA_STATUS_FAILED;
16898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    ALOGD ("%s", __FUNCTION__);
16918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Create the make_readonly semaphore */
16938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sem_init (&sMakeReadonlySem, 0, 0) == -1)
16948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGE ("%s: Make readonly semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno);
16968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return JNI_FALSE;
16978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sMakeReadonlyWaitingForComplete = JNI_TRUE;
17008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    status = nativeNfcTag_doReconnect (e, o);
17028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (status != NFA_STATUS_OK)
17038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        goto TheEnd;
17058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    status = EXTNS_MfcSetReadOnly (key, keySize);
17088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (status != NFA_STATUS_OK)
17098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        goto TheEnd;
17118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sem_wait (&sMakeReadonlySem);
17138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sMakeReadonlyStatus == NFA_STATUS_OK)
17158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        result = JNI_TRUE;
17178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17198605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoTheEnd:
17208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Destroy semaphore */
17218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sem_destroy (&sMakeReadonlySem))
17228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ALOGE ("%s: Failed to destroy read_only semaphore (errno=0x%08x)", __FUNCTION__, errno);
17248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    sMakeReadonlyWaitingForComplete = JNI_FALSE;
17268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return result;
17278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
17288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/*******************************************************************************
17318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao**
1732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_doMakeReadonly
1733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Make the tag read-only.
1735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  key: Key to access the tag.
1738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
17428605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_doMakeReadonly (JNIEnv *e, jobject o, jbyteArray)
1743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jboolean result = JNI_FALSE;
1745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status;
1746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE)
17508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
17528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};
17538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        result = nativeNfcTag_makeMifareReadonly (e, o, mfc_key1, sizeof(mfc_key1));
17548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (result == JNI_FALSE)
17558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            result = nativeNfcTag_makeMifareReadonly (e, o, mfc_key2, sizeof(mfc_key2));
17578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
17588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        return result;
17598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create the make_readonly semaphore */
1762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_init (&sMakeReadonlySem, 0, 0) == -1)
1763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Make readonly semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno);
1765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
1766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sMakeReadonlyWaitingForComplete = JNI_TRUE;
1769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Hard-lock the tag (cannot be reverted)
1771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    status = NFA_RwSetTagReadOnly(TRUE);
1772a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (status == NFA_STATUS_REJECTED)
1773a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
1774a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        status = NFA_RwSetTagReadOnly (FALSE); //try soft lock
1775a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        if (status != NFA_STATUS_OK)
1776a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        {
1777a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            ALOGE ("%s: fail soft lock, status=%d", __FUNCTION__, status);
1778a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            goto TheEnd;
1779a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        }
1780a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
1781a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    else if (status != NFA_STATUS_OK)
1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1783a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGE ("%s: fail hard lock, status=%d", __FUNCTION__, status);
1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Wait for check NDEF completion status */
1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_wait (&sMakeReadonlySem))
1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to wait for make_readonly semaphore (errno=0x%08x)", __FUNCTION__, errno);
1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sMakeReadonlyStatus == NFA_STATUS_OK)
1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        result = JNI_TRUE;
1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1799525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Destroy semaphore */
1801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sem_destroy (&sMakeReadonlySem))
1802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to destroy read_only semaphore (errno=0x%08x)", __FUNCTION__, errno);
1804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sMakeReadonlyWaitingForComplete = JNI_FALSE;
1806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return result;
1807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_registerNdefTypeHandler
1813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Register a callback to receive NDEF message from the tag
1815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  from the NFA_NDEF_DATA_EVT.
1816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project//register a callback to receive NDEF message from the tag
1821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project//from the NFA_NDEF_DATA_EVT;
1822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_registerNdefTypeHandler ()
1823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sNdefTypeHandlerHandle = NFA_HANDLE_INVALID;
1826525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NFA_RegisterNDefTypeHandler (TRUE, NFA_TNF_DEFAULT, (UINT8 *) "", 0, ndefHandlerCallback);
18278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    EXTNS_MfcRegisterNDefTypeHandler (ndefHandlerCallback);
1828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nativeNfcTag_deregisterNdefTypeHandler
1834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     No longer need to receive NDEF message from the tag.
1836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_deregisterNdefTypeHandler ()
1841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NFA_DeregisterNDefTypeHandler (sNdefTypeHandlerHandle);
1844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sNdefTypeHandlerHandle = NFA_HANDLE_INVALID;
1845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
1849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for Android 4.0.3
1851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
1853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1854525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doConnect", "(I)I", (void *)nativeNfcTag_doConnect},
1856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doDisconnect", "()Z", (void *)nativeNfcTag_doDisconnect},
1857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doReconnect", "()I", (void *)nativeNfcTag_doReconnect},
1858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doHandleReconnect", "(I)I", (void *)nativeNfcTag_doHandleReconnect},
1859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doTransceive", "([BZ[I)[B", (void *)nativeNfcTag_doTransceive},
1860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doGetNdefType", "(II)I", (void *)nativeNfcTag_doGetNdefType},
1861525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doCheckNdef", "([I)I", (void *)nativeNfcTag_doCheckNdef},
1862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doRead", "()[B", (void *)nativeNfcTag_doRead},
1863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doWrite", "([B)Z", (void *)nativeNfcTag_doWrite},
1864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doPresenceCheck", "()Z", (void *)nativeNfcTag_doPresenceCheck},
1865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doIsIsoDepNdefFormatable", "([B[B)Z", (void *)nativeNfcTag_doIsIsoDepNdefFormatable},
1866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doNdefFormat", "([B)Z", (void *)nativeNfcTag_doNdefFormat},
1867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   {"doMakeReadonly", "([B)Z", (void *)nativeNfcTag_doMakeReadonly},
1868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
1869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        register_com_android_nfc_NativeNfcTag
1874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Regisgter JNI functions with Java Virtual Machine.
1876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: Environment of JVM.
1877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status of registration.
1879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcTag (JNIEnv *e)
1882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return jniRegisterNativeMethods (e, gNativeNfcTagClassName, gMethods, NELEM (gMethods));
1885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */
1889