1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  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  *
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */
18 
19 /**
20  * @author Khen G. Kim, Aleksey V. Yantsen
21  */
22 
23 /**
24  * Created on 10.01.2004
25  */
26 package org.apache.harmony.jpda.tests.framework.jdwp;
27 
28 import java.io.UnsupportedEncodingException;
29 
30 import org.apache.harmony.jpda.tests.framework.TestErrorException;
31 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
32 import org.apache.harmony.jpda.tests.framework.jdwp.TypesLengths;
33 
34 /**
35  * This base class represents JDWP packet.
36  */
37 public class Packet {
38 
39     public static final int REPLY_PACKET_FLAG = 0x80;
40 
41     public static final int FLAGS_INDEX = 8;
42 
43     public static final int HEADER_SIZE = 11;
44 
45     /**
46      * The size in bytes of the BYTE type value.
47      */
48     protected static final int BYTE_SIZE = 1;
49 
50     /**
51      * The size in bytes of the SHORT type value.
52      */
53     protected static final int SHORT_SIZE = 2;
54 
55     /**
56      * The size in bytes of the INT type value.
57      */
58     protected static final int INT_SIZE = 4;
59 
60     /**
61      * The size in bytes of the LONG type value.
62      */
63     protected static final int LONG_SIZE = 8;
64 
65     private static final int LENGTH_INDEX = 0;
66 
67     private static final int ID_INDEX = 4;
68 
69     private int id;
70 
71     private byte flags;
72 
73     private int length;
74 
75     private byte data[];
76 
77     private int reading_data_index;
78 
79     /**
80      * A constructor that creates an empty CommandPacket with empty header
81      * fields and no data.
82      */
Packet()83     public Packet() {
84         reading_data_index = 0;
85         data = new byte[0];
86     }
87 
88     /**
89      * A constructor that creates Packet from array of bytes including header
90      * and data sections.
91      *
92      * @param p array of bytes for new packet.
93      */
Packet(byte p[])94     public Packet(byte p[]) {
95         length = (int) readFromByteArray(p, LENGTH_INDEX, INT_SIZE);
96         if (length < HEADER_SIZE) {
97             throw new TestErrorException(
98                     "Packet creation error: size of packet = " + length
99                             + "is less than header size = " + HEADER_SIZE);
100         }
101         id = (int) readFromByteArray(p, ID_INDEX, INT_SIZE);
102         flags = p[FLAGS_INDEX];
103         data = new byte[p.length - HEADER_SIZE];
104         System.arraycopy(p, HEADER_SIZE, data, 0, p.length - HEADER_SIZE);
105         reading_data_index = 0;
106     }
107 
108     /**
109      * Gets the length value of the header of the Packet.
110      *
111      * @return the length value of the header of the Packet.
112      */
getLength()113     public int getLength() {
114         return length;
115     }
116 
117     /**
118      * Sets the id value of the header of the Packet.
119      *
120      * @param i
121      *            the id value of the header of the Packet.
122      */
setId(int i)123     public void setId(int i) {
124         id = i;
125     }
126 
127     /**
128      * Gets the id value of the header of the Packet.
129      *
130      * @return the id value of the header of the Packet.
131      */
getId()132     public int getId() {
133         return id;
134     }
135 
136     /**
137      * Sets the flags value of the header of the Packet.
138      *
139      * @param f
140      *            the flags value of the header of the Packet.
141      */
setFlags(byte f)142     public void setFlags(byte f) {
143         flags = f;
144     }
145 
146     /**
147      * Gets the flags value of the header of the Packet.
148      *
149      * @return the flags value of the header of the Packet.
150      */
getFlags()151     public byte getFlags() {
152         return flags;
153     }
154 
155     /**
156      * Gets the flags value from the header of the Packet.
157      *
158      * @param tag
159      *            Type tag (see JDWP.tag)
160      * @return the flags value of the header of the Packet.
161      */
isValuePrimitiveType(byte tag)162     public boolean isValuePrimitiveType(byte tag) {
163         switch (tag) {
164         case JDWPConstants.Tag.ARRAY_TAG: {
165             return false;
166         }
167         case JDWPConstants.Tag.BYTE_TAG: {
168             return true;
169         }
170         case JDWPConstants.Tag.CHAR_TAG: {
171             return true;
172         }
173         case JDWPConstants.Tag.OBJECT_TAG: {
174             return false;
175         }
176         case JDWPConstants.Tag.FLOAT_TAG: {
177             return true;
178         }
179         case JDWPConstants.Tag.DOUBLE_TAG: {
180             return true;
181         }
182         case JDWPConstants.Tag.INT_TAG: {
183             return true;
184         }
185         case JDWPConstants.Tag.LONG_TAG: {
186             return true;
187         }
188         case JDWPConstants.Tag.SHORT_TAG: {
189             return true;
190         }
191         case JDWPConstants.Tag.VOID_TAG: {
192             return true;
193         }
194         case JDWPConstants.Tag.BOOLEAN_TAG: {
195             return true;
196         }
197         case JDWPConstants.Tag.STRING_TAG: {
198             return false;
199         }
200         case JDWPConstants.Tag.THREAD_TAG: {
201             return false;
202         }
203         case JDWPConstants.Tag.THREAD_GROUP_TAG: {
204             return false;
205         }
206         case JDWPConstants.Tag.CLASS_LOADER_TAG: {
207             return false;
208         }
209         case JDWPConstants.Tag.CLASS_OBJECT_TAG: {
210             return false;
211         }
212         case JDWPConstants.Tag.NO_TAG: {
213             return true;
214         }
215         default: {
216             throw new TestErrorException("Improper JDWP.tag value = " + tag);
217         }
218         }
219     }
220 
221     /**
222      * Sets the next value of the data of the Packet as byte.
223      *
224      * @param val
225      *            the byte value.
226      */
setNextValueAsByte(byte val)227     public void setNextValueAsByte(byte val) {
228         int new_data_size = data.length + BYTE_SIZE;
229         byte data_temp[] = data;
230         data = new byte[new_data_size];
231         System.arraycopy(data_temp, 0, data, 0, new_data_size - BYTE_SIZE);
232         data[new_data_size - BYTE_SIZE] = val;
233     }
234 
235     /**
236      * Gets the next value of the data of the Packet as byte.
237      *
238      * @return the next value of the data of the Packet as byte.
239      */
getNextValueAsByte()240     public byte getNextValueAsByte() {
241         reading_data_index = reading_data_index + BYTE_SIZE;
242         return data[reading_data_index - BYTE_SIZE];
243     }
244 
245     /**
246      * Sets the next value of the data of the Packet as boolean.
247      *
248      * @param val
249      *            the boolean value.
250      */
setNextValueAsBoolean(boolean val)251     public void setNextValueAsBoolean(boolean val) {
252         int old_data_size = data.length;
253         int new_data_size = old_data_size
254                 + TypesLengths.getTypeLength(TypesLengths.BOOLEAN_ID);
255         byte data_temp[] = data;
256         data = new byte[new_data_size];
257         System.arraycopy(data_temp, 0, data, 0, old_data_size);
258         if (val) {
259             data[old_data_size] = 1;
260         } else {
261             data[old_data_size] = 0;
262         }
263     }
264 
265     /**
266      * Gets the next value of the data of the Packet as boolean.
267      *
268      * @return the next value of the data of the Packet as boolean.
269      */
getNextValueAsBoolean()270     public boolean getNextValueAsBoolean() {
271         int res = (int) data[reading_data_index] & 0xFF;
272         reading_data_index = reading_data_index
273                 + TypesLengths.getTypeLength(TypesLengths.BOOLEAN_ID);
274         return (res != 0);
275     }
276 
277     /**
278      * Sets the next value of the data of the Packet as short.
279      *
280      * @param val
281      *            the short value.
282      */
setNextValueAsShort(short val)283     public void setNextValueAsShort(short val) {
284         int new_data_size = data.length
285                 + TypesLengths.getTypeLength(TypesLengths.SHORT_ID);
286         byte data_temp[] = data;
287         data = new byte[new_data_size];
288         System.arraycopy(data_temp, 0, data, 0, new_data_size
289                 - TypesLengths.getTypeLength(TypesLengths.SHORT_ID));
290         this.writeAtByteArray((long) val, data, new_data_size
291                 - TypesLengths.getTypeLength(TypesLengths.SHORT_ID),
292                 TypesLengths.getTypeLength(TypesLengths.SHORT_ID));
293     }
294 
295     /**
296      * Gets the next value of the data of the Packet as short.
297      *
298      * @return the next value of the data of the Packet as short.
299      */
getNextValueAsShort()300     public short getNextValueAsShort() {
301         reading_data_index = reading_data_index
302                 + TypesLengths.getTypeLength(TypesLengths.SHORT_ID);
303         return (short) readFromByteArray(data, reading_data_index
304                 - TypesLengths.getTypeLength(TypesLengths.SHORT_ID),
305                 TypesLengths.getTypeLength(TypesLengths.SHORT_ID));
306     }
307 
308     /**
309      * Sets the next value of the data of the Packet as int.
310      *
311      * @param val
312      *            the int value.
313      */
setNextValueAsInt(int val)314     public void setNextValueAsInt(int val) {
315         int new_data_size = data.length
316                 + TypesLengths.getTypeLength(TypesLengths.INT_ID);
317         byte data_temp[] = data;
318         data = new byte[new_data_size];
319         System.arraycopy(data_temp, 0, data, 0, new_data_size
320                 - TypesLengths.getTypeLength(TypesLengths.INT_ID));
321         this.writeAtByteArray((long) val, data, new_data_size
322                 - TypesLengths.getTypeLength(TypesLengths.INT_ID), TypesLengths
323                 .getTypeLength(TypesLengths.INT_ID));
324     }
325 
326     /**
327      * Gets the next value of the data of the Packet as int.
328      *
329      * @return the next value of the data of the Packet as int.
330      */
getNextValueAsInt()331     public int getNextValueAsInt() {
332         reading_data_index = reading_data_index
333                 + TypesLengths.getTypeLength(TypesLengths.INT_ID);
334         return (int) readFromByteArray(data, reading_data_index
335                 - TypesLengths.getTypeLength(TypesLengths.INT_ID), TypesLengths
336                 .getTypeLength(TypesLengths.INT_ID));
337     }
338 
339     /**
340      * Sets the next value of the data of the Packet as double.
341      *
342      * @param dval
343      *            the double value.
344      */
setNextValueAsDouble(double dval)345     public void setNextValueAsDouble(double dval) {
346         int new_data_size = data.length
347                 + TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID);
348         byte data_temp[] = data;
349         long val = Double.doubleToLongBits(dval);
350         data = new byte[new_data_size];
351         System.arraycopy(data_temp, 0, data, 0, new_data_size
352                 - TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID));
353         this.writeAtByteArray((long) val, data, new_data_size
354                 - TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID),
355                 TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID));
356     }
357 
358     /**
359      * Gets the next value of the data of the Packet as double.
360      *
361      * @return the next value of the data of the Packet as double.
362      */
getNextValueAsDouble()363     public double getNextValueAsDouble() {
364         reading_data_index = reading_data_index
365                 + TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID);
366         long res = readFromByteArray(data, reading_data_index
367                 - TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID),
368                 TypesLengths.getTypeLength(TypesLengths.DOUBLE_ID));
369 
370         return Double.longBitsToDouble(res);
371     }
372 
373     /**
374      * Sets the next value of the data of the Packet as float.
375      *
376      * @param fval
377      *            the float value.
378      */
setNextValueAsFloat(float fval)379     public void setNextValueAsFloat(float fval) {
380         int new_data_size = data.length
381                 + TypesLengths.getTypeLength(TypesLengths.FLOAT_ID);
382         byte data_temp[] = data;
383         long val = Float.floatToIntBits(fval);
384         data = new byte[new_data_size];
385         System.arraycopy(data_temp, 0, data, 0, new_data_size
386                 - TypesLengths.getTypeLength(TypesLengths.FLOAT_ID));
387         this.writeAtByteArray((long) val, data, new_data_size
388                 - TypesLengths.getTypeLength(TypesLengths.FLOAT_ID),
389                 TypesLengths.getTypeLength(TypesLengths.FLOAT_ID));
390     }
391 
392     /**
393      * Gets the next value of the data of the Packet as float.
394      *
395      * @return the next value of the data of the Packet as float.
396      */
getNextValueAsFloat()397     public float getNextValueAsFloat() {
398         reading_data_index = reading_data_index
399                 + TypesLengths.getTypeLength(TypesLengths.FLOAT_ID);
400         long res = readFromByteArray(data, reading_data_index
401                 - TypesLengths.getTypeLength(TypesLengths.FLOAT_ID),
402                 TypesLengths.getTypeLength(TypesLengths.FLOAT_ID));
403 
404         return Float.intBitsToFloat((int) res);
405     }
406 
407     /**
408      * Sets the next value of the data of the Packet as char.
409      *
410      * @param val
411      *            the char value.
412      */
setNextValueAsChar(char val)413     public void setNextValueAsChar(char val) {
414         int new_data_size = data.length
415                 + TypesLengths.getTypeLength(TypesLengths.CHAR_ID);
416         byte data_temp[] = data;
417         data = new byte[new_data_size];
418         System.arraycopy(data_temp, 0, data, 0, new_data_size
419                 - TypesLengths.getTypeLength(TypesLengths.CHAR_ID));
420         this.writeAtByteArray((long) val, data, new_data_size
421                 - TypesLengths.getTypeLength(TypesLengths.CHAR_ID),
422                 TypesLengths.getTypeLength(TypesLengths.CHAR_ID));
423     }
424 
425     /**
426      * Gets the next value of the data of the Packet as char.
427      *
428      * @return the next value of the data of the Packet as char.
429      */
getNextValueAsChar()430     public char getNextValueAsChar() {
431         reading_data_index = reading_data_index
432                 + TypesLengths.getTypeLength(TypesLengths.CHAR_ID);
433         return (char) readFromByteArray(data, reading_data_index
434                 - TypesLengths.getTypeLength(TypesLengths.CHAR_ID),
435                 TypesLengths.getTypeLength(TypesLengths.CHAR_ID));
436     }
437 
438     /**
439      * Sets the next value of the data of the Packet as long.
440      *
441      * @param val
442      *            the long value.
443      */
setNextValueAsLong(long val)444     public void setNextValueAsLong(long val) {
445         int new_data_size = data.length
446                 + TypesLengths.getTypeLength(TypesLengths.LONG_ID);
447         byte data_temp[] = data;
448         data = new byte[new_data_size];
449         System.arraycopy(data_temp, 0, data, 0, new_data_size
450                 - TypesLengths.getTypeLength(TypesLengths.LONG_ID));
451         this.writeAtByteArray(val, data, new_data_size
452                 - TypesLengths.getTypeLength(TypesLengths.LONG_ID),
453                 TypesLengths.getTypeLength(TypesLengths.LONG_ID));
454     }
455 
456     /**
457      * Gets the next value of the data of the Packet as long.
458      *
459      * @return the next value of the data of the Packet as long.
460      */
getNextValueAsLong()461     public long getNextValueAsLong() {
462         reading_data_index = reading_data_index
463                 + TypesLengths.getTypeLength(TypesLengths.LONG_ID);
464         return readFromByteArray(data, reading_data_index
465                 - TypesLengths.getTypeLength(TypesLengths.LONG_ID),
466                 TypesLengths.getTypeLength(TypesLengths.LONG_ID));
467     }
468 
469     /**
470      * Sets the next value of the data of the Packet as String in the "UTF-8"
471      * Charset.
472      *
473      * @param val
474      *            the String in the "UTF-8" Charset.
475      */
setNextValueAsString(String val)476     public void setNextValueAsString(String val) {
477         byte data_temp[] = data;
478         byte val_as_bytes[];
479         try {
480             val_as_bytes = val.getBytes("UTF-8");
481         } catch (UnsupportedEncodingException e) {
482             throw new TestErrorException(e);
483         }
484         int new_data_size = data.length + val_as_bytes.length
485                 + TypesLengths.getTypeLength(TypesLengths.INT_ID);
486         data = new byte[new_data_size];
487         System.arraycopy(data_temp, 0, data, 0, new_data_size
488                 - val_as_bytes.length
489                 - TypesLengths.getTypeLength(TypesLengths.INT_ID));
490         this.writeAtByteArray((long) val_as_bytes.length, data, new_data_size
491                 - val_as_bytes.length
492                 - TypesLengths.getTypeLength(TypesLengths.INT_ID), TypesLengths
493                 .getTypeLength(TypesLengths.INT_ID));
494         System.arraycopy(val_as_bytes, 0, data, new_data_size
495                 - val_as_bytes.length, val_as_bytes.length);
496     }
497 
498     /**
499      * Gets the next value of the data of the Packet as String in the "UTF-8"
500      * Charset.
501      *
502      * @return the next value of the data of the Packet as String in the "UTF-8"
503      *         Charset.
504      */
getNextValueAsString()505     public String getNextValueAsString() {
506         int string_length = this.getNextValueAsInt();
507         String res = null;
508         try {
509             res = new String(data, reading_data_index, string_length, "UTF-8");
510         } catch (UnsupportedEncodingException e) {
511             throw new TestErrorException(e);
512         }
513         reading_data_index = reading_data_index + string_length;
514         return res;
515     }
516 
517     /**
518      * Sets the next value of the data of the Packet as objectID VM-sensitive
519      * value. If length is less than 8 bytes, the appropriate high bits in the
520      * val value will be ignored.
521      *
522      * @param val
523      *            the ObjectID value.
524      */
setNextValueAsObjectID(long val)525     public void setNextValueAsObjectID(long val) {
526         if (TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) < 0
527                 || TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) > 8) {
528             throw new TestErrorException("Improper ObjectID value length = "
529                     + TypesLengths.getTypeLength(TypesLengths.OBJECT_ID));
530         }
531         int new_data_size = data.length
532                 + TypesLengths.getTypeLength(TypesLengths.OBJECT_ID);
533         byte data_temp[] = data;
534         data = new byte[new_data_size];
535         System.arraycopy(data_temp, 0, data, 0, new_data_size
536                 - TypesLengths.getTypeLength(TypesLengths.OBJECT_ID));
537         this.writeAtByteArray(val, data, new_data_size
538                 - TypesLengths.getTypeLength(TypesLengths.OBJECT_ID),
539                 TypesLengths.getTypeLength(TypesLengths.OBJECT_ID));
540     }
541 
542     /**
543      * Gets the next value of the data of the Packet as objectID VM-sensitive
544      * value. If length is less than 8 bytes, the appropriate high bits in the
545      * returned value can be ignored.
546      *
547      * @return the next value of the data of the Packet as VM-sensitive value.
548      */
getNextValueAsObjectID()549     public long getNextValueAsObjectID() {
550         if (TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) < 0
551                 || TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) > 8) {
552             throw new TestErrorException("Improper ObjectID value length = "
553                     + TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) + "!");
554         }
555         reading_data_index = reading_data_index
556                 + TypesLengths.getTypeLength(TypesLengths.OBJECT_ID);
557         return (int) readFromByteArray(data, reading_data_index
558                 - TypesLengths.getTypeLength(TypesLengths.OBJECT_ID),
559                 TypesLengths.getTypeLength(TypesLengths.OBJECT_ID));
560     }
561 
562     /**
563      * Sets the next value of the data of the Packet as ThreadID VM-sensitive
564      * value. If length is less than 8 bytes, the appropriate high bits in the
565      * val value will be ignored.
566      *
567      * @param val
568      *            the ThreadID value.
569      */
setNextValueAsThreadID(long val)570     public void setNextValueAsThreadID(long val) {
571         this.setNextValueAsObjectID(val);
572     }
573 
574     /**
575      * Gets the next value of the data of the Packet as ThreadID VM-sensitive
576      * value. If length is less than 8 bytes, the appropriate high bits in the
577      * returned value can be ignored.
578      *
579      * @return the next value of the data of the Packet as VM-sensitive value.
580      */
getNextValueAsThreadID()581     public long getNextValueAsThreadID() {
582         return this.getNextValueAsObjectID();
583     }
584 
585     /**
586      * Sets the next value of the data of the Packet as ThreadGroupID
587      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
588      * bits in the val value will be ignored.
589      *
590      * @param val
591      *            the ThreadGroupID value.
592      */
setNextValueAsThreadGroupID(long val)593     public void setNextValueAsThreadGroupID(long val) {
594         this.setNextValueAsObjectID(val);
595     }
596 
597     /**
598      * Gets the next value of the data of the Packet as ThreadGroupID
599      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
600      * bits in the returned value can be ignored.
601      *
602      * @return the next value of the data of the Packet as VM-sensitive value.
603      */
getNextValueAsThreadGroupID()604     public long getNextValueAsThreadGroupID() {
605         return this.getNextValueAsObjectID();
606     }
607 
608     /**
609      * Sets the next value of the data of the Packet as StringID VM-sensitive
610      * value. If length is less than 8 bytes, the appropriate high bits in the
611      * val value will be ignored.
612      *
613      * @param val
614      *            the StringID value.
615      */
setNextValueAsStringID(long val)616     public void setNextValueAsStringID(long val) {
617         this.setNextValueAsObjectID(val);
618     }
619 
620     /**
621      * Gets the next value of the data of the Packet as StringID VM-sensitive
622      * value. If length is less than 8 bytes, the appropriate high bits in the
623      * returned value can be ignored.
624      *
625      * @return the next value of the data of the Packet as VM-sensitive value.
626      */
getNextValueAsStringID()627     public long getNextValueAsStringID() {
628         return this.getNextValueAsObjectID();
629     }
630 
631     /**
632      * Sets the next value of the data of the Packet as ClassLoaderID
633      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
634      * bits in the val value will be ignored.
635      *
636      * @param val
637      *            the ClassLoaderID value.
638      */
setNextValueAsClassLoaderID(long val)639     public void setNextValueAsClassLoaderID(long val) {
640         this.setNextValueAsObjectID(val);
641     }
642 
643     /**
644      * Gets the next value of the data of the Packet as ClassLoaderID
645      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
646      * bits in the returned value can be ignored.
647      *
648      * @return the next value of the data of the Packet as VM-sensitive value.
649      */
getNextValueAsClassLoaderID()650     public long getNextValueAsClassLoaderID() {
651         return this.getNextValueAsObjectID();
652     }
653 
654     /**
655      * Sets the next value of the data of the Packet as ClassObjectID
656      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
657      * bits in the val value will be ignored.
658      *
659      * @param val
660      *            the ClassObjectID value.
661      */
setNextValueAsClassObjectID(long val)662     public void setNextValueAsClassObjectID(long val) {
663         this.setNextValueAsObjectID(val);
664     }
665 
666     /**
667      * Gets the next value of the data of the Packet as ClassObjectID
668      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
669      * bits in the returned value can be ignored.
670      *
671      * @return the next value of the data of the Packet as VM-sensitive value.
672      */
getNextValueAsClassObjectID()673     public long getNextValueAsClassObjectID() {
674         return this.getNextValueAsObjectID();
675     }
676 
677     /**
678      * Sets the next value of the data of the Packet as ArrayID VM-sensitive
679      * value. If length is less than 8 bytes, the appropriate high bits in the
680      * val value will be ignored.
681      *
682      * @param val
683      *            the ArrayID value.
684      */
setNextValueAsArrayID(long val)685     public void setNextValueAsArrayID(long val) {
686         this.setNextValueAsObjectID(val);
687     }
688 
689     /**
690      * Gets the next value of the data of the Packet as ArrayID VM-sensitive
691      * value. If length is less than 8 bytes, the appropriate high bits in the
692      * returned value can be ignored.
693      *
694      * @return the next value of the data of the Packet as VM-sensitive value.
695      */
getNextValueAsClassArrayID()696     public long getNextValueAsClassArrayID() {
697         return this.getNextValueAsObjectID();
698     }
699 
700     /**
701      * Sets the next value of the data of the Packet as ReferenceTypeID
702      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
703      * bits in the val value will be ignored.
704      *
705      * @param val
706      *            the ReferenceTypeID value.
707      */
setNextValueAsReferenceTypeID(long val)708     public void setNextValueAsReferenceTypeID(long val) {
709         this.setNextValueAsObjectID(val);
710     }
711 
712     /**
713      * Gets the next value of the data of the Packet as ReferenceTypeID
714      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
715      * bits in the returned value can be ignored.
716      *
717      * @return the next value of the data of the Packet as VM-sensitive value.
718      */
getNextValueAsReferenceTypeID()719     public long getNextValueAsReferenceTypeID() {
720         return this.getNextValueAsObjectID();
721     }
722 
723     /**
724      * Sets the next value of the data of the Packet as ClassID VM-sensitive
725      * value. If length is less than 8 bytes, the appropriate high bits in the
726      * val value will be ignored.
727      *
728      * @param val
729      *            the ClassID value.
730      */
setNextValueAsClassID(long val)731     public void setNextValueAsClassID(long val) {
732         this.setNextValueAsObjectID(val);
733     }
734 
735     /**
736      * Gets the next value of the data of the Packet as ClassID VM-sensitive
737      * value. If length is less than 8 bytes, the appropriate high bits in the
738      * returned value can be ignored.
739      *
740      * @return the next value of the data of the Packet as VM-sensitive value.
741      */
getNextValueAsClassID()742     public long getNextValueAsClassID() {
743         return this.getNextValueAsObjectID();
744     }
745 
746     /**
747      * Sets the next value of the data of the Packet as InterfaceID VM-sensitive
748      * value. If length is less than 8 bytes, the appropriate high bits in the
749      * val value will be ignored.
750      *
751      * @param val
752      *            the InterfaceID value.
753      */
setNextValueAsInterfaceID(long val)754     public void setNextValueAsInterfaceID(long val) {
755         this.setNextValueAsObjectID(val);
756     }
757 
758     /**
759      * Gets the next value of the data of the Packet as InterfaceID VM-sensitive
760      * value. If length is less than 8 bytes, the appropriate high bits in the
761      * returned value can be ignored.
762      *
763      * @return the next value of the data of the Packet as VM-sensitive value.
764      */
getNextValueAsInterfaceID()765     public long getNextValueAsInterfaceID() {
766         return this.getNextValueAsObjectID();
767     }
768 
769     /**
770      * Sets the next value of the data of the Packet as ArrayTypeID VM-sensitive
771      * value. If length is less than 8 bytes, the appropriate high bits in the
772      * val value will be ignored.
773      *
774      * @param val
775      *            the ArrayTypeID value.
776      */
setNextValueAsArrayTypeID(long val)777     public void setNextValueAsArrayTypeID(long val) {
778         this.setNextValueAsObjectID(val);
779     }
780 
781     /**
782      * Gets the next value of the data of the Packet as ArrayTypeID VM-sensitive
783      * value. If length is less than 8 bytes, the appropriate high bits in the
784      * returned value can be ignored.
785      *
786      * @return the next value of the data of the Packet as VM-sensitive value.
787      */
getNextValueAsArrayTypeID()788     public long getNextValueAsArrayTypeID() {
789         return this.getNextValueAsObjectID();
790     }
791 
792     /**
793      * Sets the next value of the data of the Packet as tagged-objectID
794      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
795      * bits in the val value will be ignored.
796      *
797      * @param taggedObject
798      *            TaggedObject value.
799      */
setNextValueAsTaggedObject(TaggedObject taggedObject)800     public void setNextValueAsTaggedObject(TaggedObject taggedObject) {
801         this.setNextValueAsByte(taggedObject.tag);
802         this.setNextValueAsObjectID(taggedObject.objectID);
803     }
804 
805     /**
806      * Gets the next value of the data of the Packet as tagged-objectID
807      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
808      * bits in the returned value can be ignored.
809      *
810      * @return the next value of the data of the Packet as VM-sensitive value.
811      */
getNextValueAsTaggedObject()812     public TaggedObject getNextValueAsTaggedObject() {
813         if (TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) < 0
814                 || TypesLengths.getTypeLength(TypesLengths.OBJECT_ID) > 8) {
815             throw new TestErrorException("Improper ObjectID value length = "
816                     + TypesLengths.getTypeLength(TypesLengths.OBJECT_ID));
817         }
818         TaggedObject taggedObject = new TaggedObject();
819         taggedObject.tag = this.getNextValueAsByte();
820         taggedObject.objectID = this.getNextValueAsObjectID();
821         return taggedObject;
822     }
823 
824     /**
825      * Sets the next value of the data of the Packet as MethodID VM-sensitive
826      * value. If length is less than 8 bytes, the appropriate high bits in the
827      * val value will be ignored.
828      *
829      * @param methodID
830      *            MethodID value.
831      */
setNextValueAsMethodID(long methodID)832     public void setNextValueAsMethodID(long methodID) {
833         if (TypesLengths.getTypeLength(TypesLengths.METHOD_ID) < 0
834                 || TypesLengths.getTypeLength(TypesLengths.METHOD_ID) > 8) {
835             throw new TestErrorException("Improper MethodID value length = "
836                     + TypesLengths.getTypeLength(TypesLengths.METHOD_ID));
837         }
838         int new_data_size = data.length
839                 + TypesLengths.getTypeLength(TypesLengths.METHOD_ID);
840         byte data_temp[] = data;
841         data = new byte[new_data_size];
842         System.arraycopy(data_temp, 0, data, 0, new_data_size
843                 - TypesLengths.getTypeLength(TypesLengths.METHOD_ID));
844         this.writeAtByteArray(methodID, data, new_data_size
845                 - TypesLengths.getTypeLength(TypesLengths.METHOD_ID),
846                 TypesLengths.getTypeLength(TypesLengths.METHOD_ID));
847     }
848 
849     /**
850      * Gets the next value of the data of the Packet as MethodID VM-sensitive
851      * value. If length is less than 8 bytes, the appropriate high bits in the
852      * returned value can be ignored.
853      *
854      * @return the next value of the data of the Packet as VM-sensitive value.
855      */
getNextValueAsMethodID()856     public long getNextValueAsMethodID() {
857         if (TypesLengths.getTypeLength(TypesLengths.METHOD_ID) < 0
858                 || TypesLengths.getTypeLength(TypesLengths.METHOD_ID) > 8) {
859             throw new TestErrorException("Improper MethodID value length = "
860                     + TypesLengths.getTypeLength(TypesLengths.METHOD_ID));
861         }
862         reading_data_index = reading_data_index
863                 + TypesLengths.getTypeLength(TypesLengths.METHOD_ID);
864         long result = readFromByteArray(data, reading_data_index
865                 - TypesLengths.getTypeLength(TypesLengths.METHOD_ID),
866                 TypesLengths.getTypeLength(TypesLengths.METHOD_ID));
867         return result;
868     }
869 
870     /**
871      * Sets the next value of the data of the Packet as FieldID VM-sensitive
872      * value. If length is less than 8 bytes, the appropriate high bits in the
873      * val value will be ignored.
874      *
875      * @param fieldID
876      *            FieldID value.
877      */
setNextValueAsFieldID(long fieldID)878     public void setNextValueAsFieldID(long fieldID) {
879         if (TypesLengths.getTypeLength(TypesLengths.FIELD_ID) < 0
880                 || TypesLengths.getTypeLength(TypesLengths.FIELD_ID) > 8) {
881             throw new TestErrorException("Improper FieldID value length = "
882                     + TypesLengths.getTypeLength(TypesLengths.FIELD_ID));
883         }
884         int new_data_size = data.length
885                 + TypesLengths.getTypeLength(TypesLengths.FIELD_ID);
886         byte data_temp[] = data;
887         data = new byte[new_data_size];
888         System.arraycopy(data_temp, 0, data, 0, new_data_size
889                 - TypesLengths.getTypeLength(TypesLengths.FIELD_ID));
890         this.writeAtByteArray(fieldID, data, new_data_size
891                 - TypesLengths.getTypeLength(TypesLengths.FIELD_ID),
892                 TypesLengths.getTypeLength(TypesLengths.FIELD_ID));
893     }
894 
895     /**
896      * Gets the next value of the data of the Packet as FieldID VM-sensitive
897      * value. If length is less than 8 bytes, the appropriate high bits in the
898      * returned value can be ignored.
899      *
900      * @return the next value of the data of the Packet as VM-sensitive value.
901      */
getNextValueAsFieldID()902     public long getNextValueAsFieldID() {
903         if (TypesLengths.getTypeLength(TypesLengths.FIELD_ID) < 0
904                 || TypesLengths.getTypeLength(TypesLengths.FIELD_ID) > 8) {
905             throw new TestErrorException("Improper FieldID value length = "
906                     + TypesLengths.getTypeLength(TypesLengths.FIELD_ID));
907         }
908         reading_data_index = reading_data_index
909                 + TypesLengths.getTypeLength(TypesLengths.FIELD_ID);
910         long result = readFromByteArray(data, reading_data_index
911                 - TypesLengths.getTypeLength(TypesLengths.FIELD_ID),
912                 TypesLengths.getTypeLength(TypesLengths.FIELD_ID));
913         return result;
914     }
915 
916     /**
917      * Sets the next value of the data of the Packet as FrameID VM-sensitive
918      * value. If length is less than 8 bytes, the appropriate high bits in the
919      * val value will be ignored.
920      *
921      * @param frameID
922      *            FrameID value.
923      */
setNextValueAsFrameID(long frameID)924     public void setNextValueAsFrameID(long frameID) {
925         if (TypesLengths.getTypeLength(TypesLengths.FRAME_ID) < 0
926                 || TypesLengths.getTypeLength(TypesLengths.FRAME_ID) > 8) {
927             throw new TestErrorException("Improper FrameID value length = "
928                     + TypesLengths.getTypeLength(TypesLengths.FRAME_ID));
929         }
930         int new_data_size = data.length
931                 + TypesLengths.getTypeLength(TypesLengths.FRAME_ID);
932         byte data_temp[] = data;
933         data = new byte[new_data_size];
934         System.arraycopy(data_temp, 0, data, 0, new_data_size
935                 - TypesLengths.getTypeLength(TypesLengths.FRAME_ID));
936         this.writeAtByteArray(frameID, data, new_data_size
937                 - TypesLengths.getTypeLength(TypesLengths.FRAME_ID),
938                 TypesLengths.getTypeLength(TypesLengths.FRAME_ID));
939     }
940 
941     /**
942      * Gets the next value of the data of the Packet as FrameID VM-sensitive
943      * value. If length is less than 8 bytes, the appropriate high bits in the
944      * returned value can be ignored.
945      *
946      * @return the next value of the data of the Packet as VM-sensitive value.
947      */
getNextValueAsFrameID()948     public long getNextValueAsFrameID() {
949         if (TypesLengths.getTypeLength(TypesLengths.FRAME_ID) < 0
950                 || TypesLengths.getTypeLength(TypesLengths.FRAME_ID) > 8) {
951             throw new TestErrorException("Improper FrameID value length = "
952                     + TypesLengths.getTypeLength(TypesLengths.FRAME_ID));
953         }
954         reading_data_index = reading_data_index
955                 + TypesLengths.getTypeLength(TypesLengths.FRAME_ID);
956         long result = readFromByteArray(data, reading_data_index
957                 - TypesLengths.getTypeLength(TypesLengths.FRAME_ID),
958                 TypesLengths.getTypeLength(TypesLengths.FRAME_ID));
959         return result;
960     }
961 
962     /**
963      * Sets the next value of the data of the Packet as Location VM-sensitive
964      * value. If length is less than 8 bytes, the appropriate high bits in the
965      * val value will be ignored.
966      *
967      * @param location
968      *            Location value.
969      */
setNextValueAsLocation(Location location)970     public void setNextValueAsLocation(Location location) {
971         this.setNextValueAsByte(location.tag);
972         this.setNextValueAsClassID(location.classID);
973         this.setNextValueAsMethodID(location.methodID);
974         this.setNextValueAsLong(location.index);
975     }
976 
977     /**
978      * Gets the next value of the data of the Packet as Location VM-sensitive
979      * value. If length is less than 8 bytes, the appropriate high bits in the
980      * returned value can be ignored.
981      *
982      * @return the next value of the data of the Packet as VM-sensitive value.
983      */
getNextValueAsLocation()984     public Location getNextValueAsLocation() {
985         Location location = new Location();
986         location.tag = this.getNextValueAsByte();
987         location.classID = this.getNextValueAsClassID();
988         location.methodID = this.getNextValueAsMethodID();
989         location.index = this.getNextValueAsLong();
990         return location;
991     }
992 
993     /**
994      * Sets the next value of the data of the Packet as Value VM-sensitive
995      * value. If length is less than 8 bytes, the appropriate high bits in the
996      * val value will be ignored.
997      *
998      * @param value
999      *            Value value.
1000      * @throws UnsupportedEncodingException
1001      */
setNextValueAsValue(Value value)1002     public void setNextValueAsValue(Value value) {
1003         this.setNextValueAsByte(value.getTag());
1004         setNextValueAsUntaggedValue(value);
1005     }
1006 
1007     /**
1008      * Gets the next value of the data of the Packet as Value VM-sensitive
1009      * value. If length is less than 8 bytes, the appropriate high bits in the
1010      * returned value can be ignored.
1011      *
1012      * @return the next value of the data of the Packet as VM-sensitive value.
1013      */
getNextValueAsValue()1014     public Value getNextValueAsValue() {
1015         byte tag = this.getNextValueAsByte();
1016         return getNextValueAsUntaggedValue(tag);
1017     }
1018 
1019     /**
1020      * Sets the next value of the data of the Packet as UntaggedValue
1021      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
1022      * bits in the val value will be ignored.
1023      *
1024      * @param value
1025      *            UntaggedValue value.
1026      * @throws UnsupportedEncodingException
1027      */
setNextValueAsUntaggedValue(Value value)1028     public void setNextValueAsUntaggedValue(Value value) {
1029         switch (value.getTag()) {
1030         case JDWPConstants.Tag.BOOLEAN_TAG:
1031             this.setNextValueAsBoolean(value.getBooleanValue());
1032             break;
1033         case JDWPConstants.Tag.BYTE_TAG:
1034             this.setNextValueAsByte(value.getByteValue());
1035             break;
1036         case JDWPConstants.Tag.CHAR_TAG:
1037             this.setNextValueAsChar(value.getCharValue());
1038             break;
1039         case JDWPConstants.Tag.DOUBLE_TAG:
1040             this.setNextValueAsDouble(value.getDoubleValue());
1041             break;
1042         case JDWPConstants.Tag.FLOAT_TAG:
1043             this.setNextValueAsFloat(value.getFloatValue());
1044             break;
1045         case JDWPConstants.Tag.INT_TAG:
1046             this.setNextValueAsInt(value.getIntValue());
1047             break;
1048         case JDWPConstants.Tag.LONG_TAG:
1049             this.setNextValueAsLong(value.getLongValue());
1050             break;
1051         case JDWPConstants.Tag.SHORT_TAG:
1052             this.setNextValueAsShort(value.getShortValue());
1053             break;
1054         case JDWPConstants.Tag.VOID_TAG:
1055             break;
1056         case JDWPConstants.Tag.STRING_TAG:
1057         case JDWPConstants.Tag.ARRAY_TAG:
1058         case JDWPConstants.Tag.CLASS_LOADER_TAG:
1059         case JDWPConstants.Tag.CLASS_OBJECT_TAG:
1060         case JDWPConstants.Tag.OBJECT_TAG:
1061         case JDWPConstants.Tag.THREAD_GROUP_TAG:
1062         case JDWPConstants.Tag.THREAD_TAG:
1063             this.setNextValueAsObjectID(value.getLongValue());
1064             break;
1065         default:
1066             throw new TestErrorException("Illegal tag value = "
1067                     + value.getTag());
1068         }
1069     }
1070 
1071     /**
1072      * Gets the next value of the data of the Packet as UntaggedValue
1073      * VM-sensitive value. If length is less than 8 bytes, the appropriate high
1074      * bits in the returned value can be ignored.
1075      *
1076      * @return the next value of the data of the Packet as VM-sensitive value.
1077      */
getNextValueAsUntaggedValue(byte tag)1078     public Value getNextValueAsUntaggedValue(byte tag) {
1079         Value value = null;
1080         switch (tag) {
1081         case JDWPConstants.Tag.BOOLEAN_TAG:
1082             value = new Value(this.getNextValueAsBoolean());
1083             break;
1084         case JDWPConstants.Tag.BYTE_TAG:
1085             value = new Value(this.getNextValueAsByte());
1086             break;
1087         case JDWPConstants.Tag.CHAR_TAG:
1088             value = new Value(this.getNextValueAsChar());
1089             break;
1090         case JDWPConstants.Tag.DOUBLE_TAG:
1091             value = new Value(this.getNextValueAsDouble());
1092             break;
1093         case JDWPConstants.Tag.FLOAT_TAG:
1094             value = new Value(this.getNextValueAsFloat());
1095             break;
1096         case JDWPConstants.Tag.INT_TAG:
1097             value = new Value(this.getNextValueAsInt());
1098             break;
1099         case JDWPConstants.Tag.LONG_TAG:
1100             value = new Value(this.getNextValueAsLong());
1101             break;
1102         case JDWPConstants.Tag.SHORT_TAG:
1103             value = new Value(this.getNextValueAsShort());
1104             break;
1105         case JDWPConstants.Tag.STRING_TAG:
1106         case JDWPConstants.Tag.ARRAY_TAG:
1107         case JDWPConstants.Tag.CLASS_LOADER_TAG:
1108         case JDWPConstants.Tag.CLASS_OBJECT_TAG:
1109         case JDWPConstants.Tag.OBJECT_TAG:
1110         case JDWPConstants.Tag.THREAD_GROUP_TAG:
1111         case JDWPConstants.Tag.THREAD_TAG:
1112             value = new Value(tag, this.getNextValueAsObjectID());
1113             break;
1114         case JDWPConstants.Tag.VOID_TAG:
1115             // no bytes to read.
1116             break;
1117         default:
1118             throw new TestErrorException("Illegal tag value = " + tag);
1119         }
1120         return value;
1121     }
1122 
1123     /**
1124      * Sets the next value of the data of the Packet as ArrayRegion VM-sensitive
1125      * value. If length is less than 8 bytes, the appropriate high bits in the
1126      * val value will be ignored.
1127      *
1128      * @param array
1129      *            ArrayRegion value.
1130      * @throws UnsupportedEncodingException
1131      */
1132     // public void setNextValueAsArrayRegion(ArrayRegion array) throws
1133     // UnsupportedEncodingException {
setNextValueAsArrayRegion(ArrayRegion array)1134     public void setNextValueAsArrayRegion(ArrayRegion array) {
1135         this.setNextValueAsByte(array.getTag());
1136         this.setNextValueAsInt(array.getLength());
1137         for (int i = 0; i < array.getLength(); i++) {
1138             if (isValuePrimitiveType(array.getTag())) {
1139                 switch (array.getTag()) {
1140                 case JDWPConstants.Tag.BOOLEAN_TAG:
1141                     this.setNextValueAsBoolean(array.getValue(i)
1142                             .getBooleanValue());
1143                     break;
1144                 case JDWPConstants.Tag.BYTE_TAG:
1145                     this.setNextValueAsByte(array.getValue(i).getByteValue());
1146                     break;
1147                 case JDWPConstants.Tag.DOUBLE_TAG:
1148                     this.setNextValueAsDouble(array.getValue(i)
1149                             .getDoubleValue());
1150                     break;
1151                 case JDWPConstants.Tag.FLOAT_TAG:
1152                     this.setNextValueAsFloat(array.getValue(i).getFloatValue());
1153                     break;
1154                 case JDWPConstants.Tag.INT_TAG:
1155                     this.setNextValueAsInt(array.getValue(i).getIntValue());
1156                     break;
1157                 case JDWPConstants.Tag.LONG_TAG:
1158                     this.setNextValueAsLong(array.getValue(i).getLongValue());
1159                     break;
1160                 case JDWPConstants.Tag.SHORT_TAG:
1161                     this.setNextValueAsShort(array.getValue(i).getShortValue());
1162                     break;
1163                 default:
1164                     throw new TestErrorException("Illegal tag value = "
1165                             + array.getTag());
1166                 }
1167             } else {
1168                 this.setNextValueAsValue(array.getValue(i));
1169             }
1170         }
1171     }
1172 
1173     /**
1174      * Gets the next value of the data of the Packet as ArrayRegion VM-sensitive
1175      * value. If length is less than 8 bytes, the appropriate high bits in the
1176      * returned value can be ignored.
1177      *
1178      * @return the next value of the data of the Packet as VM-sensitive value.
1179      */
getNextValueAsArrayRegion()1180     public ArrayRegion getNextValueAsArrayRegion() {
1181         byte array_tag = this.getNextValueAsByte();
1182         int array_length = this.getNextValueAsInt();
1183 
1184         ArrayRegion array = new ArrayRegion(array_tag, array_length);
1185 
1186         for (int i = 0; i < array_length; i++) {
1187             if (isValuePrimitiveType(array_tag))
1188                 array.setValue(i, this.getNextValueAsUntaggedValue(array_tag));
1189             else
1190                 array.setValue(i, this.getNextValueAsValue());
1191         }
1192         return array;
1193     }
1194 
1195     /**
1196      * Gets the representation of the Packet as array of bytes in the JDWP
1197      * format including header and data sections.
1198      *
1199      * @return bytes representation of this packet
1200      */
toBytesArray()1201     public byte[] toBytesArray() {
1202         byte res[] = new byte[data.length + HEADER_SIZE];
1203         writeAtByteArray(data.length + HEADER_SIZE, res, LENGTH_INDEX, INT_SIZE);
1204         writeAtByteArray(id, res, ID_INDEX, INT_SIZE);
1205         res[FLAGS_INDEX] = flags;
1206         System.arraycopy(data, 0, res, HEADER_SIZE, data.length);
1207         return res;
1208     }
1209 
1210     /**
1211      * Reads value from array of bytes ar[] starting form index and reading size
1212      * bytes. If size is less than 8, the appropriate high bits in the resulting
1213      * long value will be zero.
1214      *
1215      * @param ar
1216      *            the array of bytes where the value is read from.
1217      * @param from
1218      *            index to start reading bytes.
1219      * @param size
1220      *            number of bytes to read
1221      */
readFromByteArray(byte ar[], int from, int size)1222     protected static long readFromByteArray(byte ar[], int from, int size) {
1223         long res = 0;
1224         byte temp;
1225         for (int i = 0; i < size; i++) {
1226             temp = ar[from + i];
1227             res = (res << 8) | (((long) temp) & 0xFF);
1228         }
1229         return res;
1230     }
1231 
1232     /**
1233      * Tells whether the packet is reply.
1234      *
1235      * @return true if this packet is reply, false if it is command
1236      */
isReply()1237     public boolean isReply() {
1238         return (flags & REPLY_PACKET_FLAG) != 0;
1239     }
1240 
1241     /**
1242      * Checks whether all data has been read from the packet.
1243      *
1244      * @return boolean
1245      */
isAllDataRead()1246     public boolean isAllDataRead() {
1247         return reading_data_index == data.length;
1248     }
1249 
1250     /**
1251      * Writes value - val to the array of bytes ar[], beginning from index - to,
1252      * size of value is - size bytes. If size is less than 8, the appropriate
1253      * high bits in the val value will be ignored.
1254      *
1255      * @param val
1256      *            the value, which will be written in the array.
1257      * @param ar
1258      *            the array of bytes where the value is read from.
1259      * @param to
1260      *            the beginning index in the array of bytes.
1261      * @param size
1262      *            size of value in bytes.
1263      */
writeAtByteArray(long val, byte ar[], int to, int size)1264     protected void writeAtByteArray(long val, byte ar[], int to, int size) {
1265         for (int i = 0; i < size; i++) {
1266             ar[to + i] = (byte) (val >> 8 * (size - 1 - i));
1267         }
1268     }
1269 
1270     /**
1271      * Returns true if this bytes array can be interpreted as reply packet.
1272      *
1273      * @param p
1274      *            bytes representation of packet
1275      * @return true or false
1276      */
isReply(byte[] p)1277     public static boolean isReply(byte[] p) {
1278         if (p.length < FLAGS_INDEX)
1279             return false;
1280         return (p[FLAGS_INDEX] & REPLY_PACKET_FLAG) != 0;
1281     }
1282 
1283     /**
1284      * Returns packet length from header of given packet bytes.
1285      *
1286      * @param p
1287      *            bytes representation of packet
1288      * @return true or false
1289      */
getPacketLength(byte[] p)1290     public static int getPacketLength(byte[] p) {
1291         return (int) readFromByteArray(p, LENGTH_INDEX, INT_SIZE);
1292     }
1293 
1294     /**
1295      * Enwraps this bytes array either to ReplyPacket or EventPacket instance,
1296      * according to result of isReply().
1297      *
1298      * @param p
1299      *            bytes array to enwrap into packet
1300      * @return new created ReplyPacket or CommandPacket
1301      */
interpretPacket(byte[] p)1302     public static Packet interpretPacket(byte[] p) {
1303         if (p.length < HEADER_SIZE)
1304             throw new TestErrorException("Wrong packet");
1305         if (Packet.isReply(p))
1306             return new ReplyPacket(p);
1307         return new EventPacket(p);
1308     }
1309 }
1310