Parcelable versioning, API_VERSION=3

This commit is contained in:
Dominik Schürmann 2014-03-30 19:20:46 +02:00
parent 3fb9cddb33
commit 71a8ffc2b5
3 changed files with 72 additions and 3 deletions

View File

@ -19,12 +19,22 @@ package org.openintents.openpgp;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
/**
* Parcelable versioning has been copied from Dashclock Widget
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
*/
public class OpenPgpError implements Parcelable { public class OpenPgpError implements Parcelable {
public static final int CLIENT_SIDE_ERROR = -1; /**
* Since there might be a case where new versions of the client using the library getting
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
public static final int PARCELABLE_VERSION = 1;
// possible values for errorId
public static final int CLIENT_SIDE_ERROR = -1;
public static final int GENERIC_ERROR = 0; public static final int GENERIC_ERROR = 0;
public static final int INCOMPATIBLE_API_VERSIONS = 1; public static final int INCOMPATIBLE_API_VERSIONS = 1;
public static final int NO_OR_WRONG_PASSPHRASE = 2; public static final int NO_OR_WRONG_PASSPHRASE = 2;
public static final int NO_USER_IDS = 3; public static final int NO_USER_IDS = 3;
@ -65,15 +75,39 @@ public class OpenPgpError implements Parcelable {
} }
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
/**
* NOTE: When adding fields in the process of updating this API, make sure to bump
* {@link #PARCELABLE_VERSION}.
*/
dest.writeInt(PARCELABLE_VERSION);
// Inject a placeholder that will store the parcel size from this point on
// (not including the size itself).
int sizePosition = dest.dataPosition();
dest.writeInt(0);
int startPosition = dest.dataPosition();
// version 1
dest.writeInt(errorId); dest.writeInt(errorId);
dest.writeString(message); dest.writeString(message);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
dest.writeInt(parcelableSize);
dest.setDataPosition(startPosition + parcelableSize);
} }
public static final Creator<OpenPgpError> CREATOR = new Creator<OpenPgpError>() { public static final Creator<OpenPgpError> CREATOR = new Creator<OpenPgpError>() {
public OpenPgpError createFromParcel(final Parcel source) { public OpenPgpError createFromParcel(final Parcel source) {
int parcelableVersion = source.readInt();
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
OpenPgpError error = new OpenPgpError(); OpenPgpError error = new OpenPgpError();
error.errorId = source.readInt(); error.errorId = source.readInt();
error.message = source.readString(); error.message = source.readString();
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
return error; return error;
} }

View File

@ -19,7 +19,18 @@ package org.openintents.openpgp;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
/**
* Parcelable versioning has been copied from Dashclock Widget
* https://code.google.com/p/dashclock/source/browse/api/src/main/java/com/google/android/apps/dashclock/api/ExtensionData.java
*/
public class OpenPgpSignatureResult implements Parcelable { public class OpenPgpSignatureResult implements Parcelable {
/**
* Since there might be a case where new versions of the client using the library getting
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
public static final int PARCELABLE_VERSION = 1;
// generic error on signature verification // generic error on signature verification
public static final int SIGNATURE_ERROR = 0; public static final int SIGNATURE_ERROR = 0;
// successfully verified signature, with certified public key // successfully verified signature, with certified public key
@ -90,19 +101,43 @@ public class OpenPgpSignatureResult implements Parcelable {
} }
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
/**
* NOTE: When adding fields in the process of updating this API, make sure to bump
* {@link #PARCELABLE_VERSION}.
*/
dest.writeInt(PARCELABLE_VERSION);
// Inject a placeholder that will store the parcel size from this point on
// (not including the size itself).
int sizePosition = dest.dataPosition();
dest.writeInt(0);
int startPosition = dest.dataPosition();
// version 1
dest.writeInt(status); dest.writeInt(status);
dest.writeByte((byte) (signatureOnly ? 1 : 0)); dest.writeByte((byte) (signatureOnly ? 1 : 0));
dest.writeString(userId); dest.writeString(userId);
dest.writeLong(keyId); dest.writeLong(keyId);
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
dest.writeInt(parcelableSize);
dest.setDataPosition(startPosition + parcelableSize);
} }
public static final Creator<OpenPgpSignatureResult> CREATOR = new Creator<OpenPgpSignatureResult>() { public static final Creator<OpenPgpSignatureResult> CREATOR = new Creator<OpenPgpSignatureResult>() {
public OpenPgpSignatureResult createFromParcel(final Parcel source) { public OpenPgpSignatureResult createFromParcel(final Parcel source) {
int parcelableVersion = source.readInt();
int parcelableSize = source.readInt();
int startPosition = source.dataPosition();
OpenPgpSignatureResult vr = new OpenPgpSignatureResult(); OpenPgpSignatureResult vr = new OpenPgpSignatureResult();
vr.status = source.readInt(); vr.status = source.readInt();
vr.signatureOnly = source.readByte() == 1; vr.signatureOnly = source.readByte() == 1;
vr.userId = source.readString(); vr.userId = source.readString();
vr.keyId = source.readLong(); vr.keyId = source.readLong();
// skip over all fields added in future versions of this parcel
source.setDataPosition(startPosition + parcelableSize);
return vr; return vr;
} }

View File

@ -32,7 +32,7 @@ public class OpenPgpApi {
public static final String TAG = "OpenPgp API"; public static final String TAG = "OpenPgp API";
public static final int API_VERSION = 2; public static final int API_VERSION = 3;
public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService"; public static final String SERVICE_INTENT = "org.openintents.openpgp.IOpenPgpService";
/** /**