View Javadoc

    1   /***
    2    *
    3    * Copyright 2004 Hiram Chirino
    4    *
    5    * Licensed under the Apache License, Version 2.0 (the "License");
    6    * you may not use this file except in compliance with the License.
    7    * You may obtain a copy of the License at
    8    *
    9    * http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   **/
    18  package org.activeio;
    19
    20  import java.io.EOFException;
    21  import java.io.IOException;
    22
    23
    24  /***
    25   * Used to write and read primitives to and from a Packet.
    26   */
    27  final public class PacketData {
    28
    29      final private Packet packet;
    30      private final boolean bigEndian;
    31
    32      public PacketData(Packet packet) {
    33          this(packet, true);
    34      }
    35
    36      public PacketData(Packet packet, boolean bigEndian) {
    37          this.packet = packet;
    38          this.bigEndian = bigEndian;
    39      }
    40
    41      private void spaceNeeded(int space) throws IOException {
    42          if (packet.remaining() < space)
    43              throw new EOFException("Not enough space left in the packet.");
    44      }
    45
    46      public void readFully(byte[] b) throws IOException {
    47          readFully(b, 0, b.length);
    48      }
    49
    50      public void readFully(byte[] b, int off, int len) throws IOException {
    51          spaceNeeded(len);
    52          packet.read(b, off, len);
    53      }
    54
    55      public int skipBytes(int n) throws IOException {
    56          int rc = Math.min(n, packet.remaining());
    57          packet.position(packet.position() + rc);
    58          return rc;
    59      }
    60
    61      public boolean readBoolean() throws IOException {
    62          spaceNeeded(1);
    63          return packet.read() != 0;
    64      }
    65
    66      public byte readByte() throws IOException {
    67          spaceNeeded(1);
    68          return (byte) packet.read();
    69      }
    70
    71      public int readUnsignedByte() throws IOException {
    72          spaceNeeded(1);
    73          return packet.read();
    74      }
    75
    76      public short readShort() throws IOException {
    77          spaceNeeded(2);
    78          if( bigEndian ) {
    79              return (short) ((packet.read() << 8) + (packet.read() << 0));
    80          } else {
    81  	        return (short) ((packet.read() << 0) + (packet.read() << 8) );
    82          }
    83      }
    84
    85      public int readUnsignedShort() throws IOException {
    86          spaceNeeded(2);
    87          if( bigEndian ) {
    88              return ((packet.read() << 8) + (packet.read() << 0));
    89          } else {
    90  	        return ((packet.read() << 0) + (packet.read() << 8) );
    91          }
    92      }
    93
    94      public char readChar() throws IOException {
    95          spaceNeeded(2);
    96          if( bigEndian ) {
    97              return (char) ((packet.read() << 8) + (packet.read() << 0));
    98          } else {
    99  	        return (char) ((packet.read() << 0) + (packet.read() << 8) );
    100         }
    101     }
    102
    103     public int readInt() throws IOException {
    104         spaceNeeded(4);
    105         if( bigEndian ) {
    106 	        return ((packet.read() << 24) +
    107 	                (packet.read() << 16) +
    108 	                (packet.read() << 8) +
    109 	                (packet.read() << 0));
    110         } else {
    111 	        return ((packet.read() << 0) +
    112 	                (packet.read() << 8) +
    113 	                (packet.read() << 16) +
    114 	                (packet.read() << 24));
    115         }
    116     }
    117
    118     public long readLong() throws IOException {
    119         spaceNeeded(8);
    120         if( bigEndian ) {
    121 	        return (((long) packet.read() << 56) +
    122 	                ((long) packet.read() << 48) +
    123 	                ((long) packet.read() << 40) +
    124 	                ((long) packet.read() << 32) +
    125 	                ((long) packet.read() << 24) +
    126 	                ((packet.read()) << 16) +
    127 	                ((packet.read()) << 8) +
    128 	                ((packet.read()) << 0));
    129         } else {
    130 	        return ((packet.read() << 0) +
    131 	                (packet.read() << 8) +
    132 	                (packet.read() << 16) +
    133 	                ((long) packet.read() << 24) +
    134 	                ((long) packet.read() << 32) +
    135 	                ((long) packet.read() << 40) +
    136 	                ((long) packet.read() << 48) +
    137 	                ((long) packet.read() << 56));
    138         }
    139     }
    140
    141     public double readDouble() throws IOException {
    142         return Double.longBitsToDouble(readLong());
    143     }
    144
    145     public float readFloat() throws IOException {
    146         return Float.intBitsToFloat(readInt());
    147     }
    148
    149     public void write(int b) throws IOException {
    150         spaceNeeded(1);
    151         packet.write(b);
    152     }
    153
    154     public void write(byte[] b) throws IOException {
    155         write(b, 0, b.length);
    156     }
    157
    158     public void write(byte[] b, int off, int len) throws IOException {
    159         spaceNeeded(len);
    160         packet.write(b, off, len);
    161     }
    162
    163     public void writeBoolean(boolean v) throws IOException {
    164         spaceNeeded(1);
    165         packet.write(v ? 1 : 0);
    166     }
    167
    168     public void writeByte(int v) throws IOException {
    169         spaceNeeded(1);
    170         packet.write(v);
    171     }
    172
    173     public void writeShort(int v) throws IOException {
    174         spaceNeeded(2);
    175
    176         if (bigEndian) {
    177 	        packet.write((v >>> 8) & 0xFF);
    178 	        packet.write((v >>> 0) & 0xFF);
    179 	    } else {
    180 	        packet.write((v >>> 0) & 0xFF);
    181 	        packet.write((v >>> 8) & 0xFF);
    182 	    }
    183     }
    184
    185     public void writeChar(int v) throws IOException {
    186         spaceNeeded(2);
    187         if (bigEndian) {
    188 	        packet.write((v >>> 8) & 0xFF);
    189 	        packet.write((v >>> 0) & 0xFF);
    190         } else {
    191             packet.write((v >>> 0) & 0xFF);
    192             packet.write((v >>> 8) & 0xFF);
    193         }
    194     }
    195
    196     public void writeInt(int v) throws IOException {
    197         spaceNeeded(4);
    198         if (bigEndian) {
    199             packet.write((v >>> 24) & 0xFF);
    200             packet.write((v >>> 16) & 0xFF);
    201             packet.write((v >>> 8) & 0xFF);
    202             packet.write((v >>> 0) & 0xFF);
    203         } else {
    204             packet.write((v >>> 0) & 0xFF);
    205             packet.write((v >>> 8) & 0xFF);
    206             packet.write((v >>> 16) & 0xFF);
    207             packet.write((v >>> 24) & 0xFF);
    208         }
    209     }
    210
    211     public void writeLong(long v) throws IOException {
    212         spaceNeeded(8);
    213         if (bigEndian) {
    214 	        packet.write((int) (v >>> 56) & 0xFF);
    215 	        packet.write((int) (v >>> 48) & 0xFF);
    216 	        packet.write((int) (v >>> 40) & 0xFF);
    217 	        packet.write((int) (v >>> 32) & 0xFF);
    218 	        packet.write((int) (v >>> 24) & 0xFF);
    219 	        packet.write((int) (v >>> 16) & 0xFF);
    220 	        packet.write((int) (v >>> 8) & 0xFF);
    221 	        packet.write((int) (v >>> 0) & 0xFF);
    222         } else {
    223             packet.write((int) (v >>> 0) & 0xFF);
    224             packet.write((int) (v >>> 8) & 0xFF);
    225             packet.write((int) (v >>> 16) & 0xFF);
    226             packet.write((int) (v >>> 24) & 0xFF);
    227             packet.write((int) (v >>> 32) & 0xFF);
    228             packet.write((int) (v >>> 40) & 0xFF);
    229             packet.write((int) (v >>> 48) & 0xFF);
    230             packet.write((int) (v >>> 56) & 0xFF);
    231         }
    232     }
    233
    234     public void writeDouble(double v) throws IOException {
    235         writeLong(Double.doubleToLongBits(v));
    236     }
    237
    238     public void writeFloat(float v) throws IOException {
    239         writeInt(Float.floatToIntBits(v));
    240     }
    241
    242     public void writeRawDouble(double v) throws IOException {
    243         writeLong(Double.doubleToRawLongBits(v));
    244     }
    245
    246     public void writeRawFloat(float v) throws IOException {
    247         writeInt(Float.floatToRawIntBits(v));
    248     }
    249
    250 }