1/*
2 * Copyright (c) 2000, 2005, 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.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26/*
27 *
28 *  (C) Copyright IBM Corp. 1999 All Rights Reserved.
29 *  Copyright 1997 The Open Group Research Institute.  All rights reserved.
30 */
31
32package sun.security.krb5.internal.util;
33
34import java.io.BufferedInputStream;
35import java.io.InputStream;
36import java.io.IOException;
37
38/**
39 * This class implements a buffered input stream. It provides methods to read a chunck
40 * of data from underlying data stream.
41 *
42 * @author Yanni Zhang
43 *
44 */
45public class KrbDataInputStream extends BufferedInputStream{
46    private boolean bigEndian = true;
47
48    public void setNativeByteOrder() {
49        if (java.nio.ByteOrder.nativeOrder().
50                equals(java.nio.ByteOrder.BIG_ENDIAN)) {
51            bigEndian = true;
52        } else {
53            bigEndian = false;
54        }
55    }
56    public KrbDataInputStream(InputStream is){
57        super(is);
58    }
59
60    /**
61     * Reads a length value which is represented in 4 bytes from
62     * this input stream. The value must be positive.
63     * @return the length value represented by this byte array.
64     * @throws IOException if there are not enough bytes or it represents
65     * a negative value
66     */
67    final public int readLength4() throws IOException {
68        int len = read(4);
69        if (len < 0) {
70            throw new IOException("Invalid encoding");
71        }
72        return len;
73    }
74
75    /**
76     * Reads up to the specific number of bytes from this input stream.
77     * @param num the number of bytes to be read.
78     * @return the int value of this byte array.
79     * @throws IOException if there are not enough bytes
80     */
81    public int read(int num) throws IOException {
82        byte[] bytes = new byte[num];
83        if (read(bytes, 0, num) != num) {
84            throw new IOException("Premature end of stream reached");
85        }
86        int result = 0;
87        for (int i = 0; i < num; i++) {
88            if (bigEndian) {
89                result |= (bytes[i] & 0xff) << (num - i - 1) * 8;
90            } else {
91                result |= (bytes[i] & 0xff) << i * 8;
92            }
93        }
94        return result;
95    }
96
97    public int readVersion() throws IOException {
98        // always read in big-endian mode
99        int result = (read() & 0xff) << 8;
100        return result | (read() & 0xff);
101    }
102}
103