summaryrefslogtreecommitdiffstats
path: root/nci
diff options
context:
space:
mode:
authorEvan Chu <evanchu@broadcom.com>2014-06-13 09:09:16 -0400
committerMartijn Coenen <maco@google.com>2014-06-16 14:59:04 -0700
commit705ca580725b89b63aff0a14762024b0f2c73883 (patch)
tree65910aedc25f990dbc985ed674498c9ee5c11c50 /nci
parent77c513146427bc51db8245b89022057520a55ceb (diff)
downloadandroid_packages_apps_Nfc-705ca580725b89b63aff0a14762024b0f2c73883.tar.gz
android_packages_apps_Nfc-705ca580725b89b63aff0a14762024b0f2c73883.tar.bz2
android_packages_apps_Nfc-705ca580725b89b63aff0a14762024b0f2c73883.zip
Reassemble inbound card emulation data.
Change-Id: I7c27d000480f876c3f0f0e87a0533e9b0d7804a2
Diffstat (limited to 'nci')
-rwxr-xr-xnci/jni/NativeNfcTag.cpp4
-rw-r--r--nci/jni/RoutingManager.cpp71
-rw-r--r--nci/jni/RoutingManager.h4
3 files changed, 52 insertions, 27 deletions
diff --git a/nci/jni/NativeNfcTag.cpp b/nci/jni/NativeNfcTag.cpp
index 88b1b567..44472d01 100755
--- a/nci/jni/NativeNfcTag.cpp
+++ b/nci/jni/NativeNfcTag.cpp
@@ -886,7 +886,7 @@ static jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject, jbyteArray data
ALOGD ("%s: response %d bytes", __FUNCTION__, sRxDataBuffer.size());
if ((natTag.getProtocol () == NFA_PROTOCOL_T2T) &&
- natTag.isT2tNackResponse (sRxDataBuffer.c_str(), sRxDataBuffer.size()))
+ natTag.isT2tNackResponse (sRxDataBuffer.data(), sRxDataBuffer.size()))
{
isNack = true;
}
@@ -908,7 +908,7 @@ static jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject, jbyteArray data
result.reset(e->NewByteArray(sRxDataBuffer.size()));
if (result.get() != NULL)
{
- e->SetByteArrayRegion(result.get(), 0, sRxDataBuffer.size(), (const jbyte *) sRxDataBuffer.c_str());
+ e->SetByteArrayRegion(result.get(), 0, sRxDataBuffer.size(), (const jbyte *) sRxDataBuffer.data());
}
else
ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__);
diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp
index b4e3dcc4..0a7fe5c0 100644
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -66,6 +66,7 @@ bool RoutingManager::initialize (nfc_jni_native_data* native)
ALOGD("%s: default route is 0x%02X", fn, mDefaultEe);
setDefaultRouting();
+ mRxDataBuffer.clear ();
return true;
}
@@ -189,6 +190,7 @@ void RoutingManager::notifyActivated ()
void RoutingManager::notifyDeactivated ()
{
+ mRxDataBuffer.clear();
JNIEnv* e = NULL;
ScopedAttach attach(mNativeData->vm, &e);
if (e == NULL)
@@ -205,43 +207,64 @@ void RoutingManager::notifyDeactivated ()
}
}
-void RoutingManager::handleData (const UINT8* data, UINT8 dataLen)
+void RoutingManager::handleData (const UINT8* data, UINT32 dataLen, tNFA_STATUS status)
{
if (dataLen <= 0)
{
ALOGE("no data");
- return;
+ goto TheEnd;
}
- JNIEnv* e = NULL;
- ScopedAttach attach(mNativeData->vm, &e);
- if (e == NULL)
+ if (status == NFA_STATUS_CONTINUE)
{
- ALOGE ("jni env is null");
- return;
+ mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come
+ return; //expect another NFA_CE_DATA_EVT to come
}
-
- ScopedLocalRef<jobject> dataJavaArray(e, e->NewByteArray(dataLen));
- if (dataJavaArray.get() == NULL)
+ else if (status == NFA_STATUS_OK)
{
- ALOGE ("fail allocate array");
- return;
+ mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data
+ //entire data packet has been received; no more NFA_CE_DATA_EVT
}
-
- e->SetByteArrayRegion ((jbyteArray)dataJavaArray.get(), 0, dataLen, (jbyte *)data);
- if (e->ExceptionCheck())
+ else if (status == NFA_STATUS_FAILED)
{
- e->ExceptionClear();
- ALOGE ("fail fill array");
- return;
+ ALOGE("RoutingManager::handleData: read data fail");
+ goto TheEnd;
}
- e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifyHostEmuData, dataJavaArray.get());
- if (e->ExceptionCheck())
{
- e->ExceptionClear();
- ALOGE ("fail notify");
+ JNIEnv* e = NULL;
+ ScopedAttach attach(mNativeData->vm, &e);
+ if (e == NULL)
+ {
+ ALOGE ("jni env is null");
+ goto TheEnd;
+ }
+
+ ScopedLocalRef<jobject> dataJavaArray(e, e->NewByteArray(mRxDataBuffer.size()));
+ if (dataJavaArray.get() == NULL)
+ {
+ ALOGE ("fail allocate array");
+ goto TheEnd;
+ }
+
+ e->SetByteArrayRegion ((jbyteArray)dataJavaArray.get(), 0, mRxDataBuffer.size(),
+ (jbyte *)(&mRxDataBuffer[0]));
+ if (e->ExceptionCheck())
+ {
+ e->ExceptionClear();
+ ALOGE ("fail fill array");
+ goto TheEnd;
+ }
+
+ e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifyHostEmuData, dataJavaArray.get());
+ if (e->ExceptionCheck())
+ {
+ e->ExceptionClear();
+ ALOGE ("fail notify");
+ }
}
+TheEnd:
+ mRxDataBuffer.clear();
}
void RoutingManager::stackCallback (UINT8 event, tNFA_CONN_EVT_DATA* eventData)
@@ -280,8 +303,8 @@ void RoutingManager::stackCallback (UINT8 event, tNFA_CONN_EVT_DATA* eventData)
case NFA_CE_DATA_EVT:
{
tNFA_CE_DATA& ce_data = eventData->ce_data;
- ALOGD("%s: NFA_CE_DATA_EVT; h=0x%X; data len=%u", fn, ce_data.handle, ce_data.len);
- getInstance().handleData(ce_data.p_data, ce_data.len);
+ ALOGD("%s: NFA_CE_DATA_EVT; stat=0x%X; h=0x%X; data len=%u", fn, ce_data.status, ce_data.handle, ce_data.len);
+ getInstance().handleData(ce_data.p_data, ce_data.len, ce_data.status);
}
break;
}
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index f18919f2..ea3a840b 100644
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -46,12 +46,14 @@ private:
RoutingManager& operator=(const RoutingManager&);
void setDefaultRouting();
- void handleData (const UINT8* data, UINT8 dataLen);
+ void handleData (const UINT8* data, UINT32 dataLen, tNFA_STATUS status);
void notifyActivated ();
void notifyDeactivated ();
static void nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* eventData);
static void stackCallback (UINT8 event, tNFA_CONN_EVT_DATA* eventData);
+ std::vector<UINT8> mRxDataBuffer;
+
// Fields below are final after initialize()
nfc_jni_native_data* mNativeData;
int mDefaultEe;