diff options
author | Evan Chu <evanchu@broadcom.com> | 2014-06-13 09:09:16 -0400 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2014-06-16 14:59:04 -0700 |
commit | 705ca580725b89b63aff0a14762024b0f2c73883 (patch) | |
tree | 65910aedc25f990dbc985ed674498c9ee5c11c50 /nci | |
parent | 77c513146427bc51db8245b89022057520a55ceb (diff) | |
download | android_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-x | nci/jni/NativeNfcTag.cpp | 4 | ||||
-rw-r--r-- | nci/jni/RoutingManager.cpp | 71 | ||||
-rw-r--r-- | nci/jni/RoutingManager.h | 4 |
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; |