Added more (de)serialization factories + ByteBufUtils methods
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / PacketInMessageFactory.java
1 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
2 \r
3 import io.netty.buffer.ByteBuf;\r
4 \r
5 import java.math.BigInteger;\r
6 \r
7 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId;\r
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
11 \r
12 /**\r
13  * @author michal.polkorab\r
14  * @author timotej.kubas\r
15  */\r
16 public class PacketInMessageFactory implements OFDeserializer<PacketInMessage> {\r
17 \r
18     private static PacketInMessageFactory instance;\r
19     private static final byte PADDING_IN_PACKET_IN_HEADER = 2;\r
20     \r
21     private PacketInMessageFactory() {\r
22         // Singleton\r
23     }\r
24     \r
25     /**\r
26      * @return singleton factory\r
27      */\r
28     public static PacketInMessageFactory getInstance(){\r
29         if(instance == null){\r
30             instance = new PacketInMessageFactory();\r
31         }\r
32         \r
33         return instance;\r
34     }\r
35 \r
36     @Override\r
37     public PacketInMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
38         PacketInMessageBuilder pimb = new PacketInMessageBuilder();\r
39         pimb.setVersion(version);\r
40         pimb.setXid(rawMessage.readUnsignedInt());\r
41         pimb.setBufferId(rawMessage.readUnsignedInt());\r
42         pimb.setTotalLen(rawMessage.readUnsignedShort());\r
43         pimb.setReason(rawMessage.readUnsignedByte());\r
44         pimb.setTableId(new TableId((long)rawMessage.readUnsignedByte()));\r
45         \r
46         byte[] cookie = new byte[8];\r
47         rawMessage.readBytes(cookie);\r
48         pimb.setCookie(new BigInteger(cookie));\r
49         // TODO - implement match factories to finish this factory \r
50         rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER);\r
51         \r
52         pimb.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
53         \r
54         return pimb.build();\r
55     }\r
56 }\r