--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMaskBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMaskBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMaskBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {\r
+ private static GetAsyncReplyMessageFactory instance;\r
+ \r
+ private GetAsyncReplyMessageFactory() {\r
+ // singleton\r
+ }\r
+\r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static GetAsyncReplyMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new GetAsyncReplyMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ @Override\r
+ public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
+ GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();\r
+ builder.setVersion(version);\r
+ builder.setXid(rawMessage.readUnsignedInt());\r
+ builder.setPacketInMask(decodePacketInMask(rawMessage));\r
+ builder.setPortStatusMask(decodePortStatusMask(rawMessage));\r
+ builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));\r
+ return builder.build();\r
+ }\r
+ \r
+ private static List<PacketInMask> decodePacketInMask(ByteBuf outputBuf) {\r
+ List<PacketInReason> readPIRList = new ArrayList<PacketInReason>();\r
+ List<PacketInMask> inMasks = new ArrayList<PacketInMask>();\r
+ PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder();\r
+ \r
+ readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
+ readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
+ inMasks.add(maskBuilder.setMask(readPIRList).build()); \r
+ return inMasks;\r
+ }\r
+ \r
+ private static List<PortStatusMask> decodePortStatusMask(ByteBuf outputBuf) {\r
+ List<PortReason> readPortReasonList = new ArrayList<PortReason>();\r
+ List<PortStatusMask> inMasks = new ArrayList<PortStatusMask>();\r
+ PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder();\r
+ \r
+ readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
+ readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
+ inMasks.add(maskBuilder.setMask(readPortReasonList).build()); \r
+ return inMasks;\r
+ }\r
+ \r
+ private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf outputBuf) {\r
+ List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<FlowRemovedReason>();\r
+ List<FlowRemovedMask> inMasks = new ArrayList<FlowRemovedMask>();\r
+ FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder();\r
+ \r
+ readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+ readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+ inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build()); \r
+ return inMasks;\r
+ }\r
+ \r
+ private static PacketInReason decodedPacketInReason(int input) {\r
+ PacketInReason reason = null;\r
+ Boolean OFPRNOMATCH = (input & (1 << 0)) > 0;\r
+ Boolean OFPRACTION = (input & (1 << 1)) > 0;\r
+ Boolean OFPRINVALIDTTL = (input & (1 << 2)) > 0;\r
+ \r
+ if (OFPRNOMATCH) {\r
+ return PacketInReason.forValue(0);\r
+ }\r
+ if (OFPRACTION) {\r
+ return PacketInReason.forValue(1);\r
+ }\r
+ if (OFPRINVALIDTTL) {\r
+ return PacketInReason.forValue(2);\r
+ }\r
+ \r
+ return reason;\r
+ }\r
+ \r
+ private static PortReason decodePortReason(int input) {\r
+ PortReason reason = null;\r
+ Boolean OFPPRADD = (input & (1 << 0)) > 0;\r
+ Boolean OFPPRDELETE = (input & (1 << 1)) > 0;\r
+ Boolean OFPPRMODIFY = (input & (1 << 2)) > 0;\r
+ \r
+ if (OFPPRADD) {\r
+ return PortReason.forValue(0);\r
+ }\r
+ if (OFPPRDELETE) {\r
+ return PortReason.forValue(1);\r
+ }\r
+ if (OFPPRMODIFY) {\r
+ return PortReason.forValue(2);\r
+ }\r
+ \r
+ return reason;\r
+ }\r
+ \r
+ private static FlowRemovedReason decodeFlowRemovedReason(int input) {\r
+ FlowRemovedReason reason = null;\r
+ Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) > 0;\r
+ Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) > 0;\r
+ Boolean OFPRRDELETE = (input & (1 << 2)) > 0;\r
+ Boolean OFPRRGROUPDELETE = (input & (1 << 3)) > 0;\r
+ \r
+ if (OFPRRIDLETIMEOUT) {\r
+ return FlowRemovedReason.forValue(0);\r
+ }\r
+ if (OFPRRHARDTIMEOUT) {\r
+ return FlowRemovedReason.forValue(1);\r
+ }\r
+ if (OFPRRDELETE) {\r
+ return FlowRemovedReason.forValue(2);\r
+ }\r
+ if (OFPRRGROUPDELETE) {\r
+ return FlowRemovedReason.forValue(3);\r
+ }\r
+ \r
+ return reason;\r
+ }\r
+}\r