package com.netifera.platform.net.wifi.decoders; import java.nio.ByteBuffer; import com.netifera.platform.net.packets.AbstractPacket; import com.netifera.platform.net.packets.IPacketDecoder; import com.netifera.platform.net.packets.IPacketHeader; import com.netifera.platform.net.packets.PacketPayload; import com.netifera.platform.net.wifi.packets.AVSCaptureHeader; import com.netifera.platform.net.wifi.packets.PrismCaptureHeader; public class PrismDecoder implements IPacketDecoder { private final static IPacketDecoder wifiDecoder = new WiFiDecoder(); private static final int WLANCAP_MAGIC_COOKIE_V1 = 0x80211001; private static final int WLANCAP_MAGIC_COOKIE_V2 = 0x80211002; private static final int PRISM_COOKIE = 0x44; public IPacketHeader decode(ByteBuffer buffer) { final ByteBuffer prismBuffer = buffer.slice(); final int cookie = prismBuffer.getInt(0); final IPacketHeader header; if(cookie == WLANCAP_MAGIC_COOKIE_V1 || cookie == WLANCAP_MAGIC_COOKIE_V2) { header = new AVSCaptureHeader(); } else if(AbstractPacket.swap32(cookie) == PRISM_COOKIE) { header = new PrismCaptureHeader(); } else { header = null; } if(header != null && header.unpack(prismBuffer)) { header.setNextPacket( wifiDecoder.decode(prismBuffer)); return header; } else { return new PacketPayload(prismBuffer); } } // private static final int WLANCAP_MAGIC_COOKIE_V1 = 0x80211001; // private static final int WLANCAP_MAGIC_COOKIE_V2 = 0x80211002; // // private static final PrismDecoder instance; // static { // instance = new PrismDecoder(); // instance.put(PrismCaptureHeader.class, null, WiFiDecoder.defaultInstance()); // instance.put(AVSCaptureHeader.class, null, WiFiDecoder.defaultInstance()); // } // // static public PrismDecoder defaultInstance() { // return instance; // } // // // public IPacket decode(byte[] data, int offset, int length) { // int cookie = FieldPacker.bufferUnpack32(data, offset); // if(cookie == WLANCAP_MAGIC_COOKIE_V1 || cookie == WLANCAP_MAGIC_COOKIE_V2) { // return decode(data, offset, length, AVSCaptureHeader.class); // } else { // if(Bytesex.swap32(cookie) != 0x44) return null; // return decode(data, offset, length , PrismCaptureHeader.class); // } // } }