summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2011-04-08 16:42:22 +0200
committerMartijn Coenen <maco@google.com>2011-05-27 08:18:18 -0700
commit8bede1704717f594a0f924a57ff46f6300347e30 (patch)
tree13b2c6393c5556e28aee44b0d86a088a84c0e377 /core
parentaa4fa2c5b704b60f025c34fec42db63ede9ebf35 (diff)
downloadframeworks_base-8bede1704717f594a0f924a57ff46f6300347e30.zip
frameworks_base-8bede1704717f594a0f924a57ff46f6300347e30.tar.gz
frameworks_base-8bede1704717f594a0f924a57ff46f6300347e30.tar.bz2
Fix NdefRecord flags handling.
NdefMessages created from byte arrays set the wrong flags on NdefRecord: every record had at least FLAG_MB|FLAG_ME set, instead of actually setting the flags from the byte-stream itself. Fixed by creating an internal constructor which can take the flags. Public constructor remains the same, as we don't want to bother application writers with these flags - they can be inferred from the context in which the record is used. Getting the flags is not a public operation on an NdefRecord either. However, applications can get the byte[] representation and it is reasonable for them to expect the flags byte to be set correctly. Change-Id: Ic32411688dd092c55b1aeccbba9635792e15a671
Diffstat (limited to 'core')
-rw-r--r--core/java/android/nfc/NdefRecord.java21
-rw-r--r--core/jni/android_nfc_NdefMessage.cpp4
-rw-r--r--core/jni/android_nfc_NdefRecord.cpp7
3 files changed, 24 insertions, 8 deletions
diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java
index 746d3df..fe215fd 100644
--- a/core/java/android/nfc/NdefRecord.java
+++ b/core/java/android/nfc/NdefRecord.java
@@ -163,6 +163,18 @@ public final class NdefRecord implements Parcelable {
* must not be null
*/
public NdefRecord(short tnf, byte[] type, byte[] id, byte[] payload) {
+ /* New NDEF records created by applications will have FLAG_MB|FLAG_ME
+ * set by default; when multiple records are stored in a
+ * {@link NdefMessage}, these flags will be corrected when the {@link NdefMessage}
+ * is serialized to bytes.
+ */
+ this(tnf, type, id, payload, (byte)(FLAG_MB|FLAG_ME));
+ }
+
+ /**
+ * @hide
+ */
+ /*package*/ NdefRecord(short tnf, byte[] type, byte[] id, byte[] payload, byte flags) {
/* check arguments */
if ((type == null) || (id == null) || (payload == null)) {
throw new IllegalArgumentException("Illegal null argument");
@@ -172,9 +184,6 @@ public final class NdefRecord implements Parcelable {
throw new IllegalArgumentException("TNF out of range " + tnf);
}
- /* generate flag */
- byte flags = FLAG_MB | FLAG_ME;
-
/* Determine if it is a short record */
if(payload.length < 0xFF) {
flags |= FLAG_SR;
@@ -258,6 +267,7 @@ public final class NdefRecord implements Parcelable {
}
public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mFlags);
dest.writeInt(mTnf);
dest.writeInt(mType.length);
dest.writeByteArray(mType);
@@ -270,6 +280,7 @@ public final class NdefRecord implements Parcelable {
public static final Parcelable.Creator<NdefRecord> CREATOR =
new Parcelable.Creator<NdefRecord>() {
public NdefRecord createFromParcel(Parcel in) {
+ byte flags = (byte)in.readInt();
short tnf = (short)in.readInt();
int typeLength = in.readInt();
byte[] type = new byte[typeLength];
@@ -281,7 +292,7 @@ public final class NdefRecord implements Parcelable {
byte[] payload = new byte[payloadLength];
in.readByteArray(payload);
- return new NdefRecord(tnf, type, id, payload);
+ return new NdefRecord(tnf, type, id, payload, flags);
}
public NdefRecord[] newArray(int size) {
return new NdefRecord[size];
@@ -290,4 +301,4 @@ public final class NdefRecord implements Parcelable {
private native int parseNdefRecord(byte[] data);
private native byte[] generate(short flags, short tnf, byte[] type, byte[] id, byte[] data);
-} \ No newline at end of file
+}
diff --git a/core/jni/android_nfc_NdefMessage.cpp b/core/jni/android_nfc_NdefMessage.cpp
index 9beef2a..d9b64aa 100644
--- a/core/jni/android_nfc_NdefMessage.cpp
+++ b/core/jni/android_nfc_NdefMessage.cpp
@@ -86,7 +86,7 @@ static jint android_nfc_NdefMessage_parseNdefMessage(JNIEnv *e, jobject o,
if (records_array == NULL)
goto end;
- ctor = e->GetMethodID(record_cls, "<init>", "(S[B[B[B)V");
+ ctor = e->GetMethodID(record_cls, "<init>", "(S[B[B[BB)V");
for (i = 0; i < num_of_records; i++) {
jbyteArray type, id, payload;
@@ -128,7 +128,7 @@ static jint android_nfc_NdefMessage_parseNdefMessage(JNIEnv *e, jobject o,
(jbyte *)record.PayloadData);
new_record = e->NewObject(record_cls, ctor,
- (jshort)record.Tnf, type, id, payload);
+ (jshort)record.Tnf, type, id, payload, (jbyte)record.Flags);
e->SetObjectArrayElement(records_array, i, new_record);
diff --git a/core/jni/android_nfc_NdefRecord.cpp b/core/jni/android_nfc_NdefRecord.cpp
index a7a80c8..e8cc4c6 100644
--- a/core/jni/android_nfc_NdefRecord.cpp
+++ b/core/jni/android_nfc_NdefRecord.cpp
@@ -91,7 +91,7 @@ static jint android_nfc_NdefRecord_parseNdefRecord(JNIEnv *e, jobject o,
jint ret = -1;
phFriNfc_NdefRecord_t record;
- jfieldID mType, mId, mPayload, mTnf;
+ jfieldID mType, mId, mPayload, mTnf, mFlags;
jbyteArray type = NULL;
jbyteArray id = NULL;
jbyteArray payload = NULL;
@@ -142,10 +142,15 @@ static jint android_nfc_NdefRecord_parseNdefRecord(JNIEnv *e, jobject o,
if (payload == NULL) {
goto clean_and_return;
}
+
e->SetByteArrayRegion(payload, 0, record.PayloadLength,
(jbyte *)record.PayloadData);
e->SetObjectField(o, mPayload, payload);
+ /* Set flags field */
+ mFlags = e->GetFieldID(record_cls, "mFlags", "B");
+ e->SetIntField(o, mFlags, record.Flags);
+
ret = 0;
clean_and_return: