Index: base/android/java/src/org/chromium/base/UnguessableToken.java |
diff --git a/base/android/java/src/org/chromium/base/UnguessableToken.java b/base/android/java/src/org/chromium/base/UnguessableToken.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4280257e71dc19a0f739a517772bebea45305048 |
--- /dev/null |
+++ b/base/android/java/src/org/chromium/base/UnguessableToken.java |
@@ -0,0 +1,91 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.base; |
+ |
+import android.os.Parcel; |
+import android.os.Parcelable; |
+ |
+import org.chromium.base.annotations.CalledByNative; |
+ |
+/** |
+ * This class mirrors unguessable_token.h . Since tokens are passed by value, |
+ * we don't bother to maintain a native token. This implements Parcelable so |
+ * that it may be sent via binder. |
+ * |
+ * To get one of these from native, one must start with a |
+ * base::UnguessableToken, then create a Java object from it. See |
+ * jni_unguessable_token.h for information. |
+ */ |
+public class UnguessableToken implements Parcelable { |
+ private final long mHigh; |
+ private final long mLow; |
+ |
+ private UnguessableToken(long high, long low) { |
+ mHigh = high; |
+ mLow = low; |
+ } |
+ |
+ @CalledByNative |
+ private static UnguessableToken create(long high, long low) { |
+ return new UnguessableToken(high, low); |
+ } |
+ |
+ @CalledByNative |
+ private long getHighForSerialization() { |
+ return mHigh; |
+ } |
+ |
+ @CalledByNative |
+ private long getLowForSerialization() { |
+ return mLow; |
+ } |
+ |
+ @Override |
+ public int describeContents() { |
+ return 0; |
+ } |
+ |
+ @Override |
+ public void writeToParcel(Parcel dest, int flags) { |
+ dest.writeLong(mHigh); |
+ dest.writeLong(mLow); |
+ } |
+ |
+ public static final Parcelable.Creator<UnguessableToken> CREATOR = |
+ new Parcelable.Creator<UnguessableToken>() { |
+ @Override |
+ public UnguessableToken createFromParcel(Parcel source) { |
+ long high = source.readLong(); |
+ long low = source.readLong(); |
+ if (high == 0 || low == 0) { |
+ // Refuse to create an empty UnguessableToken. |
+ return null; |
+ } |
+ return new UnguessableToken(high, low); |
+ } |
+ |
+ @Override |
+ public UnguessableToken[] newArray(int size) { |
+ return new UnguessableToken[size]; |
+ } |
+ }; |
+ |
+ // To avoid unwieldy calls in JNI for tests, parcel and unparcel. |
+ // TODO(liberato): It would be nice if we could include this only with a |
+ // java driver that's linked only with unit tests, but i don't see a way |
+ // to do that. |
+ @CalledByNative |
+ private UnguessableToken parcelAndUnparcelForTesting() { |
+ Parcel parcel = Parcel.obtain(); |
+ writeToParcel(parcel, 0); |
+ |
+ // Rewind the parcel and un-parcel. |
+ parcel.setDataPosition(0); |
+ UnguessableToken token = CREATOR.createFromParcel(parcel); |
+ parcel.recycle(); |
+ |
+ return token; |
+ } |
+}; |