Stream5250.java
上传用户:xiekaiwei
上传日期:2015-07-04
资源大小:620k
文件大小:4k
源码类别:

Telnet客户端

开发平台:

Java

  1. /**
  2.  * Title: tn5250J
  3.  * Copyright:   Copyright (c) 2001
  4.  * Company:
  5.  * @author  Kenneth J. Pouncey
  6.  * @version 0.4
  7.  *
  8.  * Description:
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this software; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  23.  * Boston, MA 02111-1307 USA
  24.  *
  25.  */
  26. package org.tn5250j.framework.tn5250;
  27. public class Stream5250 {
  28.     public int streamSize;
  29.     public int opCode;
  30.     public int dataStart;
  31.     public int pos;
  32.     public byte buffer[];
  33.     public Stream5250(byte abyte0[]) {
  34.         buffer = abyte0;
  35.         // size without end of record 0xFF 0xEF
  36.         streamSize = (abyte0[0] & 0xff) << 8 | abyte0[1] & 0xff;
  37.         opCode = abyte0[9];
  38.         dataStart = 6 + abyte0[6];
  39.         pos = dataStart;
  40.     }
  41.     public final int getOpCode() {
  42.         return opCode;
  43.     }
  44.     public final byte getNextByte()
  45.         throws Exception  {
  46.         if(pos > buffer.length)
  47.             throw new Exception("Buffer length exceeded: " + pos);
  48.         else
  49.             return buffer[pos++];
  50.     }
  51.     public final void setPrevByte()
  52.         throws Exception {
  53.         if(pos == 0) {
  54.             throw new Exception("Index equals zero.");
  55.         }
  56.         else {
  57.             pos--;
  58.             return;
  59.       }
  60.    }
  61.    /**
  62.     * Returns where we are in the buffer
  63.     * @return position in the buffer
  64.     */
  65.    public final int getCurrentPos() {
  66.       return pos;
  67.    }
  68.    public final byte getByteOffset(int off)
  69.         throws Exception  {
  70.         if((pos + off ) > buffer.length)
  71.             throw new Exception("Buffer length exceeded: " + pos);
  72.         else
  73.             return buffer[pos + off];
  74.    }
  75.    public final boolean size() {
  76.       return pos >= streamSize;
  77.    }
  78.    /**
  79.     * Determines if any more bytes are available in the buffer to be processed.
  80.     * @return yes or no
  81.     */
  82.    public final boolean hasNext() {
  83. //      return pos >= buffer.length;
  84.       return pos < streamSize;
  85.    }
  86.    /**
  87.     * This routine will retrieve a segment based on the first two bytes being
  88.     * the length of the segment.
  89.     *
  90.     * @return a new byte array containing the bytes of the segment.
  91.     * @throws Exception
  92.     */
  93.    public final byte[] getSegment() throws Exception {
  94.       // The first two bytes contain the length of the segment.
  95.       int length = ((buffer[pos] & 0xff )<< 8 | (buffer[pos+1] & 0xff));
  96.       // allocate space for it.
  97.       byte[] segment = new byte[length];
  98.       getSegment(segment,length,true);
  99.       return segment;
  100.    }
  101.    /**
  102.     * This routine will retrieve a byte array based on the first two bytes being
  103.     * the length of the segment.
  104.     *
  105.     * @param segment - byte array
  106.     * @param length - length of segment to return
  107.     * @param adjustPos - adjust the position of the buffer to the end of the seg
  108.     *                      ment
  109.     * @throws Exception
  110.     */
  111.    public final void getSegment(byte[] segment, int length, boolean adjustPos)
  112.                throws Exception {
  113.       // If the length is larger than what is available throw an exception
  114.       if((pos + length ) > buffer.length)
  115.             throw new Exception("Buffer length exceeded: start " + pos
  116.                                  + " length " + length);
  117.       // use the system array copy to move the bytes from the buffer
  118.       //    to the allocated byte array
  119.       System.arraycopy(buffer,pos,segment,0,length);
  120.       // update the offset to be after the segment so the next byte can be read
  121.       if (adjustPos)
  122.          pos +=length;
  123.    }
  124. }