1/*
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.io.ByteArrayInputStream;
25import java.io.DataInputStream;
26import java.io.IOException;
27import java.io.InputStream;
28
29/**
30 * Generic JDWP reply
31 */
32public abstract class JdwpReply {
33
34    protected final static int HEADER_LEN = 11;
35    private byte[] errCode = new byte[2];
36    private byte[] data;
37
38    public final void initFromStream(InputStream is) throws IOException {
39        DataInputStream ds = new DataInputStream(is);
40
41        int length = ds.readInt();
42        int id = ds.readInt();
43        byte flags = (byte) ds.read();
44
45        ds.read(errCode, 0, 2);
46
47        int dataLength = length - HEADER_LEN;
48        if (dataLength > 0) {
49            data = new byte[dataLength];
50            ds.read(data, 0, dataLength);
51            parseData(new DataInputStream(new ByteArrayInputStream(data)));
52        }
53    }
54
55    protected void parseData(DataInputStream ds) throws IOException {
56    }
57
58    protected byte[] readJdwpString(DataInputStream ds) throws IOException {
59        byte[] str = null;
60        int len = ds.readInt();
61        if (len > 0) {
62            str = new byte[len];
63            ds.read(str, 0, len);
64        }
65        return str;
66    }
67
68    protected long readRefId(DataInputStream ds) throws IOException {
69        return ds.readLong();
70    }
71
72    public int getErrorCode() {
73        return (((errCode[0] & 0xFF) << 8) | (errCode[1] & 0xFF));
74    }
75}
76