package com.aionemu.packetsamurai.parser.valuereader; import java.util.Map; import javax.swing.JComponent; import javax.swing.JLabel; import javolution.util.FastMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.aionemu.packetsamurai.parser.datatree.IntValuePart; import com.aionemu.packetsamurai.parser.datatree.ValuePart; /** * * @author Gilles Duboscq * */ public class BitSetReader implements Reader { private Map<Integer,Bit> _bits = new FastMap<Integer, Bit>(); public boolean loadReaderFromXML(Node n) { for(Node subNode = n.getFirstChild(); subNode != null; subNode = subNode.getNextSibling()) { if("bit".equals(subNode.getNodeName())) { NamedNodeMap attrs = subNode.getAttributes(); Node atr = attrs.getNamedItem("num"); if(atr == null) { //wrong return false; } int bitId = 0; boolean inverted = false; try { bitId = Integer.parseInt(atr.getNodeValue()); } catch (NumberFormatException e) { //wrong return false; } atr = attrs.getNamedItem("inverted"); if(atr != null) { inverted = Boolean.parseBoolean(atr.getNodeValue()); } atr = attrs.getNamedItem("display"); _bits.put(bitId, new Bit(bitId, atr.getNodeValue(),inverted)); } else { //wtf?? } } return true; } public String read(ValuePart part) { if(!(part instanceof IntValuePart)) // this should be detected at loading anyway, we have to give the part type to the load function so it can check it { return ""; } int val = ((IntValuePart)part).getIntValue(); // XXX this should be long to acept Q StringBuilder sb = new StringBuilder(); int size = part.getType().getTypeByteNumber()*8; for(int i = 0; i<size; i++) { Bit b = _bits.get(i); if(b != null) { sb.append(b.name+":"+Boolean.toString((val&i) != 0)+" "); } } return sb.toString(); } public JComponent readToComponent(ValuePart part) { return new JLabel(this.read(part)); } private class Bit { int number; String name; boolean inverted; public Bit(int num, String n, boolean i) { number = num; name = n; inverted = i; } } public boolean saveReaderToXML(Element element, Document doc) { for (Bit b : _bits.values()) { Element bit = doc.createElement("bit"); bit.setAttribute("num", Integer.toString(b.number)); bit.setAttribute("display", b.name); if(b.inverted) bit.setAttribute("inverted", "true"); element.appendChild(bit); } return false; } public boolean supportsEnum() { return false; } public <T extends Enum<T>> T getEnum(ValuePart part) { return null; } }