package com.github.nukc.plugin.axml.decode;
import com.github.nukc.plugin.axml.utils.Pair;
import java.io.IOException;
import java.util.Stack;
public class BXMLTree implements IAXMLSerialize{
private final int NS_START = 0x00100100;
private final int NS_END = 0x00100101;
private final int NODE_START= 0x00100102;
private final int NODE_END = 0x00100103;
private final int TEXT = 0x00100104;
private Stack<BXMLNode> mVisitor;
private BNSNode mRoot;
private int mSize;
public BXMLTree(){
mRoot = new BNSNode();
mVisitor = new Stack<BXMLNode>();
}
public void print(IVisitor visitor){
mRoot.accept(visitor);
}
public void write(IntWriter writer) throws IOException{
write(mRoot, writer);
}
public void prepare(){
mSize = 0;
prepare(mRoot);
}
private void write(BXMLNode node, IntWriter writer) throws IOException{
node.writeStart(writer);
if(node.hasChild()){
for(BXMLNode child : node.getChildren()){
write(child, writer);
}
}
node.writeEnd(writer);
}
private void prepare(BXMLNode node){
node.prepare();
Pair<Integer,Integer> p = node.getSize();
mSize += p.first + p.second;
if(node.hasChild()){
for(BXMLNode child:node.getChildren()){
prepare(child);
}
}
}
public int getSize(){
return mSize;
}
public BXMLNode getRoot(){
return mRoot;
}
public void read(IntReader reader) throws IOException{
mRoot.checkStartTag(NS_START);
mVisitor.push(mRoot);
mRoot.readStart(reader);
int chunkType;
end:while(true){
chunkType = reader.readInt();
switch(chunkType){
case NODE_START:
{
BTagNode node = new BTagNode();
node.checkStartTag(NODE_START);
BXMLNode parent = mVisitor.peek();
parent.addChild(node);
mVisitor.push(node);
node.readStart(reader);
}
break;
case NODE_END:
{
BTagNode node = (BTagNode)mVisitor.pop();
node.checkEndTag(NODE_END);
node.readEnd(reader);
}
break;
case TEXT:
{
System.out.println("Hello Text");
}
break;
case NS_END:
break end;
}
}
if( !mRoot.equals(mVisitor.pop())){
throw new IOException("doc has invalid end");
}
mRoot.checkEndTag(chunkType);
mRoot.readEnd(reader);
}
@Override
public int getType() {
return 0;
}
@Override
public void setSize(int size) {
}
@Override
public void setType(int type) {
}
}