package org.okip.service.filing.impl.rfs; /* * $Source: /home/svn/cvs2svn-2.1.1/at-cvs-repo/VUE2/src/oki/old/filing/DataBlock.java,v $ */ /** * A byte buffer that when serialized will only send portion * that has been used. * * Note that in order to be friendlier to the garbage collector * in dealing with the allocation of a series of large buffers, instances * of this class aren't intended to stay around long -- they're really * meant more as a bulk argument pass, and the RFS implementation is * frequently nulling out the buffer contained here. So if for some * reason you want to keep one around for a while after getting * it back from one of the internal read calls, make a copy of it. * Passing it between the interal read/write's is fine. * <p> * Licensed under the {@link org.okip.service.ApiImplementationLicenseMIT MIT OKI™ API Implementation License}. * * @version $Revision: 1.1 $ / $Date: 2003-04-14 20:48:28 $ */ class DataBlock implements java.io.Serializable, Cloneable { int length; boolean containsEOF = false; transient int off = 0; // will always be 0 after serialization transient byte[] buf; protected DataBlock(byte[] buf, int off, int len) { this.buf = buf; this.off = off; this.length = len; } protected DataBlock(byte[] buf, int len) { this(buf, 0, len); } /* * We manually serialize the buffer here so that if, * of instance, we have a 512k buffer, yet only 3 * bytes of it are filled up, we only have to send the 3 * bytes instead of the whole buffer. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { s.defaultWriteObject(); s.write(buf, off, length); } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, java.lang.ClassNotFoundException { s.defaultReadObject(); buf = new byte[length]; s.readFully(buf); } public String toString() { String s = "DataBlock" + Integer.toHexString(hashCode()) + "["; if (buf != null) { s += buf.length + "@" + Integer.toHexString(buf.hashCode()); if (buf.length != length) s += " used="+length; if (off != 0) s += " off=" + off; if (length <= 8) s += " \"" + new String(buf, 0, length) + "\""; } else s += "length="+length + " off="+off; if (containsEOF) s += " EOF"; return s + "]"; } protected DataBlock copy() { try { return (DataBlock) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } }