/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.network.mtp.entity;
import java.io.IOException;
import im.actor.runtime.bser.DataInput;
import im.actor.core.network.mtp.entity.rpc.Push;
import im.actor.core.network.mtp.entity.rpc.RpcError;
import im.actor.core.network.mtp.entity.rpc.RpcFloodWait;
import im.actor.core.network.mtp.entity.rpc.RpcInternalError;
import im.actor.core.network.mtp.entity.rpc.RpcOk;
import im.actor.core.network.mtp.entity.rpc.RpcRequest;
// Disabling Bounds checks for speeding up calculations
/*-[
#define J2OBJC_DISABLE_ARRAY_BOUND_CHECKS 1
]-*/
public class ProtoSerializer {
public static ProtoStruct readMessagePayload(byte[] bs) throws IOException {
return readMessagePayload(new DataInput(bs, 0, bs.length));
}
public static ProtoStruct readMessagePayload(DataInput bs) throws IOException {
final int header = bs.readByte();
switch (header) {
case Ping.HEADER:
return new Ping(bs);
case Pong.HEADER:
return new Pong(bs);
case Drop.HEADER:
return new Drop(bs);
case Container.HEADER:
return new Container(bs);
case MTRpcRequest.HEADER:
return new MTRpcRequest(bs);
case MTRpcResponse.HEADER:
return new MTRpcResponse(bs);
case MessageAck.HEADER:
return new MessageAck(bs);
case NewSessionCreated.HEADER:
return new NewSessionCreated(bs);
case MTPush.HEADER:
return new MTPush(bs);
case UnsentMessage.HEADER:
return new UnsentMessage(bs);
case UnsentResponse.HEADER:
return new UnsentResponse(bs);
case RequestResend.HEADER:
return new UnsentResponse(bs);
case SessionLost.HEADER:
return new SessionLost(bs);
case AuthIdInvalid.HEADER:
return new AuthIdInvalid(bs);
case RequestStartAuth.HEADER:
return new RequestStartAuth(bs);
case ResponseStartAuth.HEADER:
return new ResponseStartAuth(bs);
case RequestGetServerKey.HEADER:
return new RequestGetServerKey(bs);
case ResponseGetServerKey.HEADER:
return new ResponseGetServerKey(bs);
case RequestDH.HEADER:
return new RequestDH(bs);
case ResponseDoDH.HEADER:
return new ResponseDoDH(bs);
}
throw new IOException("Unable to read proto object with header #" + header);
}
public static ProtoStruct readRpcResponsePayload(byte[] data) throws IOException {
DataInput bs = new DataInput(data, 0, data.length);
final int header = bs.readByte();
switch (header) {
case RpcOk.HEADER:
return new RpcOk(bs);
case RpcError.HEADER:
return new RpcError(bs);
case RpcFloodWait.HEADER:
return new RpcFloodWait(bs);
case RpcInternalError.HEADER:
return new RpcInternalError(bs);
}
throw new IOException("Unable to read proto object");
}
public static ProtoStruct readRpcRequestPayload(DataInput bs) throws IOException {
final int header = bs.readByte();
switch (header) {
case RpcRequest.HEADER:
return new RpcRequest(bs);
}
throw new IOException("Unable to read proto object with header #" + header);
}
public static Push readUpdate(byte[] bs) throws IOException {
return readUpdate(new DataInput(bs, 0, bs.length));
}
public static Push readUpdate(DataInput bs) throws IOException {
return new Push(bs);
}
}