package org.krakenapps.pcap.decoder.smb.trans2parser;
import org.krakenapps.pcap.decoder.netbios.NetBiosNameCodec;
import org.krakenapps.pcap.decoder.smb.FindInfoLevelMapper;
import org.krakenapps.pcap.decoder.smb.SmbSession;
import org.krakenapps.pcap.decoder.smb.TransData;
import org.krakenapps.pcap.decoder.smb.TransStruct;
import org.krakenapps.pcap.decoder.smb.request.Transaction2Request;
import org.krakenapps.pcap.decoder.smb.rr.FindInformationLevel;
import org.krakenapps.pcap.decoder.smb.trans2req.FindNext2Request;
import org.krakenapps.pcap.decoder.smb.trans2resp.FindNext2Response;
import org.krakenapps.pcap.decoder.smb.transparser.TransParser;
import org.krakenapps.pcap.util.Buffer;
import org.krakenapps.pcap.util.ByteOrderConverter;
public class FindNext2Parser implements TransParser{
@Override
public TransData parseRequest(Buffer setupBuffer , Buffer parameterBuffer , Buffer dataBuffer) {
FindNext2Request transData = new FindNext2Request();
transData.setSubcommand(ByteOrderConverter.swap(setupBuffer.getShort()));
transData.setSid(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setSearchCount(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setInformationLevel(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setResumekey(ByteOrderConverter.swap(parameterBuffer.getInt()));
transData.setFlags(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setFileName(NetBiosNameCodec.readSmbUnicodeName(parameterBuffer));
// System.out.println(transData.getFileName());
// read GEA List
return transData;
}
@Override
public TransData parseResponse(Buffer setupBuffer , Buffer parameterBuffer , Buffer dataBuffer , SmbSession session) {
FindNext2Response transData = new FindNext2Response();
FindInfoLevelMapper mapper = new FindInfoLevelMapper();
TransStruct []struct;
if(parameterBuffer.readableBytes() !=0){
transData.setSearchCount(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setEndOfSearch(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setEaErrorOffset(ByteOrderConverter.swap(parameterBuffer.getShort()));
transData.setLastNameOffset(ByteOrderConverter.swap(parameterBuffer.getShort()));
}
struct = new TransStruct[transData.getSearchCount()];
for(int i =0 ; i< transData.getSearchCount(); i++){
struct[i] = mapper.getStruct(FindInformationLevel.parse( ((FindNext2Request)((Transaction2Request)session.getUseSessionData()).getTransaction2Data()).getInformationLevel()));
if(struct[i] == null){
// System.out.println("info Level = " +FindInformationLevel.parse( ((FindNext2Request)((Transaction2Request)session.getUseSessionData()).getTransaction2Data()).getInformationLevel()));
break;
}
if(dataBuffer.readableBytes() == 0){
break;
}
dataBuffer.discardReadBytes();
struct[i].parse(dataBuffer , session);
}
transData.setInfoStruct(struct);
// TODO : data parsing
return transData;
}
}