package games.strategy.engine.message.unifiedmessenger;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import games.strategy.engine.message.RemoteMethodCall;
import games.strategy.net.GUID;
// someone wants us to invoke something locally
public abstract class Invoke implements Externalizable {
private static final long serialVersionUID = -5453883962199970896L;
public GUID methodCallID;
public boolean needReturnValues;
public RemoteMethodCall call;
public Invoke() {}
@Override
public String toString() {
return "invoke on:" + call.getRemoteName() + " method name:" + call.getMethodName() + " method call id:"
+ methodCallID;
}
public Invoke(final GUID methodCallID, final boolean needReturnValues, final RemoteMethodCall call) {
if (needReturnValues && methodCallID == null) {
throw new IllegalArgumentException("Cant have no id and need return values");
}
if (!needReturnValues && methodCallID != null) {
throw new IllegalArgumentException("Cant have id and not need return values");
}
this.methodCallID = methodCallID;
this.needReturnValues = needReturnValues;
this.call = call;
}
@Override
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
needReturnValues = in.read() == 1;
if (needReturnValues) {
methodCallID = (GUID) in.readObject();
}
call = new RemoteMethodCall();
call.readExternal(in);
}
@Override
public void writeExternal(final ObjectOutput out) throws IOException {
out.write(needReturnValues ? 1 : 0);
if (needReturnValues) {
out.writeObject(methodCallID);
}
call.writeExternal(out);
}
}