package org.societies.comm.android.ipc; import android.os.Bundle; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; public class MessageMethodResult { private static final String KEY_ID = "id", KEY_RETURN_VALUE = "returnValue", KEY_THROWABLE = "throwable"; public static final int WHAT = 2; private String id; private Object returnValue; private boolean hasThrowable = false; private Throwable throwable; private Message msg; public MessageMethodResult(MessageMethodInvocation method, Object returnValue) { this.returnValue= returnValue; Bundle data = new Bundle(); data.putParcelable(KEY_RETURN_VALUE, new ReturnValue(returnValue)); msg = Message.obtain(null, WHAT); msg.setData(data); } public MessageMethodResult(MessageMethodInvocation method, Throwable throwable) { this.throwable= throwable; hasThrowable = true; Bundle data = new Bundle(); data.putSerializable(KEY_THROWABLE, throwable); msg = Message.obtain(null, WHAT); msg.setData(data); } public MessageMethodResult(Message message) { msg = message; message.getData().setClassLoader(MessageMethodResult.class.getClassLoader()); id = message.getData().getString(KEY_ID); if(message.getData().containsKey(KEY_THROWABLE)) { hasThrowable = true; throwable = (Throwable)message.getData().getSerializable(KEY_THROWABLE); } else returnValue = ((ReturnValue)message.getData().getParcelable(KEY_RETURN_VALUE)).returnValue(); } public String id() { return id; } public boolean hasThrowable() { return hasThrowable; } public Throwable throwable() { return throwable; } public Object returnValue() { return returnValue; } public Message message() { return msg; } private static class ReturnValue implements Parcelable { private Object returnValue; public ReturnValue(Object returnValue) { this.returnValue = returnValue; } public Object returnValue() { return returnValue; } public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeValue(returnValue); } public static final Parcelable.Creator<ReturnValue> CREATOR = new Parcelable.Creator<ReturnValue>() { public ReturnValue createFromParcel(Parcel in) { return new ReturnValue(in); } public ReturnValue[] newArray(int size) { return new ReturnValue[size]; } }; private ReturnValue(Parcel in) { returnValue = in.readValue(ReturnValue.class.getClassLoader()); } } }