package me.piebridge.brevent.protocol; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.os.TransactionTooLargeException; import android.support.annotation.CallSuper; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; /** * brevent protocol, request via socket, response via broadcast * <p> * Created by thom on 2017/2/6. */ public class BreventProtocol implements Parcelable { private static final String KEY_BREVENT = "brevent"; public static final InetAddress HOST = InetAddress.getLoopbackAddress(); // md5(BuildConfig.APPLICATION_ID) public static final int PORT = 59526; private static final int VERSION = BuildConfig.VERSION_CODE; public static final int STATUS_REQUEST = 0; public static final int STATUS_RESPONSE = 1; public static final int UPDATE_BREVENT = 2; public static final int CONFIGURATION = 3; public static final int UPDATE_PRIORITY = 4; private int mVersion; private int mAction; public boolean retry; public BreventProtocol(int action) { this.mVersion = VERSION; this.mAction = action; } protected BreventProtocol(Parcel in) { mVersion = in.readInt(); mAction = in.readInt(); } @Override @CallSuper public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mVersion); dest.writeInt(mAction); } @Override public final int describeContents() { return 0; } public final int getAction() { return mAction; } public final boolean versionMismatched() { return mVersion != VERSION; } public void writeTo(DataOutputStream os) throws IOException, RemoteException { Parcel parcel = Parcel.obtain(); writeToParcel(parcel, 0); byte[] bytes = parcel.marshall(); parcel.recycle(); int size = bytes.length; if (size > Short.MAX_VALUE) { throw new TransactionTooLargeException(); } os.writeShort(size); os.write(bytes); } public static BreventProtocol unwrap(byte[] bytes) { Parcel parcel = Parcel.obtain(); parcel.unmarshall(bytes, 0, bytes.length); parcel.setDataPosition(0); parcel.readInt(); // skip version int action = parcel.readInt(); parcel.setDataPosition(0); Parcelable.Creator<? extends BreventProtocol> creator; switch (action) { case STATUS_REQUEST: creator = BreventProtocol.CREATOR; break; case STATUS_RESPONSE: creator = BreventStatus.CREATOR; break; case UPDATE_BREVENT: creator = BreventPackages.CREATOR; break; case CONFIGURATION: creator = BreventConfiguration.CREATOR; break; case UPDATE_PRIORITY: creator = BreventPriority.CREATOR; break; default: creator = null; break; } try { if (creator != null) { return creator.createFromParcel(parcel); } else { return null; } } finally { parcel.recycle(); } } public static void wrap(Intent intent, BreventProtocol protocol) { intent.putExtra(KEY_BREVENT, protocol); } public static BreventProtocol unwrap(Intent intent) { return intent.getParcelableExtra(KEY_BREVENT); } @Override public String toString() { return "version: " + mVersion + ", action: " + mAction; } public static final Creator<BreventProtocol> CREATOR = new Creator<BreventProtocol>() { @Override public BreventProtocol createFromParcel(Parcel in) { return new BreventProtocol(in); } @Override public BreventProtocol[] newArray(int size) { return new BreventProtocol[size]; } }; }