View Javadoc

1   package com.tapina.robe.runtime;
2   
3   import java.awt.*;
4   
5   /***
6    * This class provides abstracted access to a virtual byte array.
7    * The byte array in question will actually be a subset of an existing byte array.
8    */
9   public final class ByteArray extends BinaryDataSource {
10      private final byte[] array;
11      private final int offset;
12      private final int length;
13  
14      public ByteArray(byte[] array, int offset, int length) {
15          this.array = array;
16          this.offset = offset;
17          this.length = length;
18      }
19  
20      public final byte getByte(int offset) {
21          checkOffset(offset);
22          return array[offset + this.offset];
23      }
24  
25      private final void checkOffset(int offset) {
26          if (offset > this.length) {
27              throw new ArrayIndexOutOfBoundsException(offset);
28          }
29      }
30  
31      public final void set(int offset, byte b) {
32          checkOffset(offset);
33          array[offset + this.offset] = b;
34      }
35  
36      public final int getWord(int offset) {
37          checkOffset(offset + 3);
38          return ByteArrayUtils.getInt(array, offset + this.offset);
39      }
40  
41      public final void setInt(int offset, int i) {
42          checkOffset(offset + 3);
43          ByteArrayUtils.putInt(array, offset + this.offset, i);
44      }
45  
46      public final void setString0(int offset, String s) {
47          checkOffset(offset + s.length());
48          ByteArrayUtils.putString0(array, offset + this.offset, s);
49      }
50  
51  
52      public void setString0(int offset, String s, int length) {
53          checkOffset(offset + s.length() - 1);
54          ByteArrayUtils.putString0(array, offset + this.offset, s, length);
55      }
56  
57      public final Rectangle getRectangle(int offset) {
58          checkOffset(offset + 15);
59          return ByteArrayUtils.getRectangle(array, offset + this.offset);
60      }
61  
62      public final void setRectangle(int offset, Rectangle r) {
63          checkOffset(offset + 15);
64          ByteArrayUtils.putRectangle(array, offset + this.offset, r);
65      }
66  
67      public final Point getPoint(int offset) {
68          checkOffset(offset + 7);
69          return ByteArrayUtils.getPoint(array, offset + this.offset);
70      }
71  
72      public final void setPoint(int offset, Point p) {
73          checkOffset(offset + 7);
74          ByteArrayUtils.putPoint(array, offset + this.offset, p);
75      }
76  
77      public final int getLength() {
78          return length;
79      }
80  
81      public byte[] getArray() {
82          return array;
83      }
84  
85      public int getOffset() {
86          return offset;
87      }
88  
89      String getTerminatedString(int offset, StringTerminator stringTerminator, int maxLength) {
90          checkOffset(offset);
91          return ByteArrayUtils.getTerminatedString(array, offset + this.offset, stringTerminator, maxLength);
92      }
93  
94      public ByteArray getByteArray(int offset, int count, boolean create) {
95          checkOffset(this.offset);
96          try {
97              checkOffset(this.offset + count - 1);
98          } catch (ArrayIndexOutOfBoundsException e) {
99              if (!create) {
100                 return null;
101             } else {
102                 throw e;
103             }
104         }
105         return new ByteArray(array, offset + this.offset, count);
106     }
107 
108     public byte[] getBytes(int offset, int count) {
109         checkOffset(offset + count - 1);
110         final byte[] data = new byte[count];
111         System.arraycopy(array, offset + this.offset, data, 0, count);
112         return data;
113     }
114 
115     public long get5ByteValue(int offset) {
116         checkOffset(offset + 4);
117         return ByteArrayUtils.get5ByteValue(array, offset + this.offset);
118     }
119 
120     public int[] getWords(int offset, int count) {
121         int[] words = new int[count];
122         for (count--; count >= 0; count--) {
123             words[count] = ByteArrayUtils.getInt(array, offset + this.offset + (count * 4));
124         }
125         return words;
126     }
127 }