Back to project page steamchat.
The source code is released under:
Apache License
If you think the Android project steamchat listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.kevelbreh.steamchat.steam2.packet; /*from w ww. jav a 2 s.c o m*/ import com.google.protobuf.AbstractMessage; import com.google.protobuf.GeneratedMessage; import com.kevelbreh.steamchat.SteamChat; import com.kevelbreh.steamchat.steam.language.Message; import com.kevelbreh.steamchat.steam.proto.SteamMessagesBaseProto.CMsgProtoBufHeader; import com.kevelbreh.steamchat.steam.util.BinaryReader; import com.kevelbreh.steamchat.steam.util.BinaryWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Protobuf backed packet for Steam network communication. */ public class ProtoPacket<T extends GeneratedMessage.Builder<T>> extends Packet { /** * The header protobuf builder. This is automatically generated by protobuf for the CMsgProtoBufHeader * defined proto. */ private CMsgProtoBufHeader.Builder header = CMsgProtoBufHeader.newBuilder(); /** * The body content of the packet. This is also automatically generated by a defined proto. */ private T body; /** * @return the header of the packet. */ public CMsgProtoBufHeader.Builder getHeader() { return header; } /** * @return the body of the packet. */ public T getBody() { return body; } @SuppressWarnings("unchecked") public ProtoPacket(Class<? extends AbstractMessage> klass, int messageType) { this(klass); setMessageType(messageType); } @SuppressWarnings("unchecked") public ProtoPacket(Class<? extends AbstractMessage> klass) { try { final Method method = klass.getMethod("newBuilder"); body = (T) method.invoke(null); } catch(final IllegalAccessException e) { SteamChat.debug(this, "Failed to create packet: " + e.toString()); } catch(final NoSuchMethodException e) { SteamChat.debug(this, "Failed to create packet: " + e.toString()); } catch(final SecurityException e) { SteamChat.debug(this, "Failed to create packet: " + e.toString()); } catch(final IllegalArgumentException e) { SteamChat.debug(this, "Failed to create packet: " + e.toString()); } catch(final InvocationTargetException e) { SteamChat.debug(this, "Failed to create packet: " + e.toString()); } } @Override public byte[] serialize() throws IOException { final BinaryWriter stream = new BinaryWriter(); header.setSteamid(getSteamId()); header.setClientSessionid(getSessionId()); header.setJobidSource(getSourceJobId()); header.setJobidTarget(getTargetJobId()); SteamChat.debug("Serializing message=" + getMessageType()); final byte[] header_data = header.build().toByteArray(); stream.write(Message.buff(getMessageType())); stream.write(header_data.length); stream.write(header_data); stream.write(body.build().toByteArray()); return stream.toByteArray(); } @Override public void deserialize() throws IOException { BinaryReader stream = new BinaryReader(getData()); // Read packet type and header length. int messagetype = stream.readInt(); int headerlength = stream.readInt(); // Read proto header and merge into our builder. header = CMsgProtoBufHeader.newBuilder(); final byte[] temp = stream.readBytes(headerlength); header.mergeFrom(temp); setTargetJobId(header.getJobidTarget()); setSourceJobId(header.getJobidSource()); // Read the body of the packet. body.mergeFrom(stream.getStream()); } }