/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jade.imtp.leap.nio; //#J2ME_EXCLUDE_FILE import java.nio.ByteBuffer; import java.util.logging.Level; import java.util.logging.Logger; /** * static helper for ssl/nio related handshaking/input/output * @author eduard */ public class NIOHelper { public static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0); private NIOHelper() { } private static final Logger log = Logger.getLogger(NIOHelper.class.getName()); /** * logs info on a bytebuffer at level FINE with name "unknown" * @param b */ public static void logBuffer(ByteBuffer b) { logBuffer(b, "unknown"); } /** * logs info on a bytebuffer at level FINE with name <name> * @param b */ public static void logBuffer(ByteBuffer b, String name) { logBuffer(b, name, Level.FINE); } /** * logs info on a bytebuffer at level <l> with name <name> * @param b */ public static void logBuffer(ByteBuffer b, String name, Level l) { if (log.isLoggable(l)) { log.log(l,"bufferinfo " + name + ": pos " + b.position() + ", rem " + b.remaining() + ", lim " + b.limit()); } } /** * copy data from src to dst, as much as fits in dst. src's position() will be moved * when data are copied. * @param src copy from * @param dst copy to * @return number of bytes copied */ public static int copyAsMuchAsFits( ByteBuffer dst, ByteBuffer src) { if (dst.hasRemaining() && src.hasRemaining()) { // current position in dst int pos = dst.position(); // read from src as much as fits in dst int limit = src.limit(); if (src.remaining() > dst.remaining()) { // data from src does not fit, set limit so that data will fit if (log.isLoggable(Level.FINE)) { log.fine("setting limit of src buffer to " + (src.position() + dst.remaining())); } src.limit(src.position() + dst.remaining()); } dst.put(src); // reset limit, to make rest of data available to put in payload buffer src.limit(limit); if (log.isLoggable(Level.FINE)) { log.fine("bytes copied to dst " + (dst.position() - pos) + ", bytes left in src " + src.remaining()); logBuffer(src, "src"); logBuffer(dst, "dst"); } // return number of data read into dst return dst.position() - pos; } else { return 0; } } /** * returns an enlarged, empty buffer * @param b * @param extraSpace * @return the new enlarged buffer */ public static ByteBuffer enlargeBuffer(ByteBuffer b, int extraSpace) { if (log.isLoggable(Level.FINE)) { logBuffer(b,"enlarging buffer with " + extraSpace); } ByteBuffer bigger = ByteBuffer.allocateDirect(b.capacity() + extraSpace); return bigger; } /** * returns an enlarged, filled with bytes from the buffer argument * @param b * @param extraSpace * @return the new enlarged buffer */ public static ByteBuffer enlargeAndFillBuffer(ByteBuffer b, int extraSpace) { ByteBuffer bigger = enlargeBuffer(b, extraSpace); bigger.put(b); return bigger; } }