package hep.io.root.reps; import hep.io.root.core.AbstractRootObject; import hep.io.root.core.RootInput; import hep.io.root.interfaces.TLeaf; import java.io.IOException; /** * @author Tony Johnson (tonyj@slac.stanford.edu) * @version $Id: TBasketRep.java 8584 2006-08-10 23:06:37Z duns $ */ public abstract class TBasketRep extends AbstractRootObject implements hep.io.root.interfaces.TBasket { private java.util.Date fDatime; private RootInput data; private RootInput rin; private String fClassName; private String fName; private String fTitle; private byte[] fBufferRef; private int[] fDisplacement; private int[] fEntryOffset; private byte flag; private int fBufferSize; private int fLast; private int fNbytes; // number of bytes for the compressed object+key // private int fNevBuf; private int fNevBufSize; private int fObjlen; // Length of uncompressed object // private long fSeekKey; // Address of the object on file (points to fNbytes) // private long fSeekPdir; private short fCycle; private short fKeylen; // number of bytes for the key structure // public RootInput setPosition(long index, long offset, TLeaf leaf) throws IOException { int i = (int) (index - offset); if (fEntryOffset == null) { data.setPosition(fKeylen + (i * fNevBufSize)); } else { data.setPosition(fEntryOffset[i]); } return data; } public void readEntryOffsets(int len) throws IOException { int last = getLast(); data.setPosition(last); fEntryOffset = new int[len]; data.readArray(fEntryOffset); // Currently there is no handling for displacements, I am not clear // what they are for anyway. } public void readMembers(RootInput in) throws IOException { fNbytes = in.readInt(); int v = in.readVersion(); fObjlen = in.readInt(); fDatime = ((hep.io.root.interfaces.TDatime) in.readObject("TDatime")).getDate(); fKeylen = in.readShort(); fCycle = in.readShort(); if (v > 1000) { fSeekKey = in.readLong(); fSeekPdir = in.readLong(); } else { fSeekKey = in.readInt(); fSeekPdir = in.readInt(); } fClassName = in.readObject("TString").toString(); fName = in.readObject("TString").toString(); fTitle = in.readObject("TString").toString(); rin = in.getTop(); v = in.readVersion(this); fBufferSize = in.readInt(); fNevBufSize = in.readInt(); fNevBuf = in.readInt(); fLast = in.readInt(); if (fLast > fBufferSize) fBufferSize = fLast; flag = in.readByte(); // flag == 0 indicates the data is in a separate root branch? if ((flag != 0) && ((flag % 10) != 2)) { fEntryOffset = new int[fNevBufSize]; if (fNevBuf != 0) in.readArray(fEntryOffset); if ((20 < flag) && (flag < 40)) { for (int i = 0; i < fNevBuf; i++) { fEntryOffset[i] &= ~0xFF000000; } } if (flag > 40) { fDisplacement = new int[fNevBufSize]; in.readArray(fDisplacement); } } if ((flag == 1) || (flag > 10)) { int len; if (v > 1) len = fLast; else len = in.readInt(); data = in.slice(len); } in.checkLength(this); if (data == null) data = getData(); } abstract RootInput getData() throws IOException; }