package com.aionemu.packetsamurai.parser.datatree; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; import com.aionemu.packetsamurai.parser.DataStructure.DataPacketMode; import com.aionemu.packetsamurai.parser.formattree.Part; import com.aionemu.packetsamurai.parser.parttypes.StringPartType.stringType; /** * * @author Gilles Duboscq * */ public class StringValuePart extends ValuePart { protected String _string; protected stringType _type; public StringValuePart(DataTreeNodeContainer parent, Part part, stringType type) { super(parent, part); _type = type; } @Override public void parse(ByteBuffer buf) { if(this.getMode() == DataPacketMode.FORGING) throw new IllegalStateException("Can not parse on a Forging mode Data Packet Tree element"); int pos = buf.position(); int size = 0; switch(_type) { case s: StringBuffer sb = new StringBuffer(); byte b; while ((b = buf.get()) != 0) sb.append((char)b); _string = sb.toString(); size = sb.length()+1; break; case S: StringBuffer sb2 = new StringBuffer(); char ch; while ((ch = buf.getChar()) != 0) sb2.append(ch); _string = sb2.toString(); size = sb2.length()*2+2; break; case Ss: StringBuffer sb3 = new StringBuffer(); char ch1; while ((ch1 = buf.getChar()) != 0) { sb3.append(ch1); } _string = sb3.toString(); size = getBSize(); break; } // sets the raw bytes _bytes = new byte[size]; buf.position(pos); buf.get(_bytes); } @Override public void forge(DataOutput stream) throws IOException { if(this.getMode() == DataPacketMode.PARSING) throw new IllegalStateException("Can not call forge on a Parsing mode Data Packet Tree element"); switch(_type) { case S: if (_string == null) { stream.writeChar('\000'); } else { final int len = _string.length(); for (int i=0; i < len; i++) stream.writeChar(_string.charAt(i)); stream.writeChar('\000'); } break; case s: if (_string == null) { stream.write((byte)0x00); } else { final int len = _string.length(); for (int i=0; i < len; i++) stream.write((byte) _string.charAt(i)); stream.write((byte)0x00); } break; case Ss: for (int i = 0; i < (_string.getBytes().length /2); i++) { stream.writeChar(_string.charAt(i)); } break; } } public String getStringValue() { return _string; } public void setStringValue(String s) { if(this.getMode() == DataPacketMode.PARSING) throw new IllegalStateException("Can not set value on a Parsing mode Data Packet Tree element"); _string = s; } @Override public String getValueAsString() { return _string; } }