DirectByteBuffer.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.PlatformAddress;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.PlatformAddressFactory;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.nio.internal.DirectBuffer;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.nio.internal.nls.Messages;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DirectByteBuffer, ReadWriteDirectByteBuffer and ReadOnlyDirectByteBuffer
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compose the implementation of platform memory based byte buffers.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DirectByteBuffer implements all the shared readonly methods and is extended
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the other two classes.
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * All methods are marked final for runtime performance.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectabstract class DirectByteBuffer extends BaseByteBuffer implements DirectBuffer {
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // This class will help us track whether the address is valid or not.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final class SafeAddress {
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected volatile boolean isValid = true;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected final PlatformAddress address;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected SafeAddress(PlatformAddress address) {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super();
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.address = address;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // This is a wrapped reference to the base address of the buffer memory.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected final SafeAddress safeAddress;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // This is the offset from the base address at which this buffer logically
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // starts.
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected final int offset;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new direct byte buffer of the given capacity on newly
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * allocated OS memory.  The memory will have been zeroed.  When the
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instance is discarded the OS memory will be freed if it has not
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * already been done so by an explicit call to #free().  Callers are
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * encouraged to explicitly free the memory where possible.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    DirectByteBuffer(int capacity) {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(new SafeAddress(PlatformAddressFactory.alloc(capacity, (byte)0)), capacity, 0);
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        safeAddress.address.autoFree();
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    DirectByteBuffer(SafeAddress address, int capacity, int offset) {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(capacity);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PlatformAddress baseAddress = address.address;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long baseSize = baseAddress.getSize();
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((baseSize >= 0) && ((offset + capacity) > baseSize)) {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException("slice out of range");
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.safeAddress = address;
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.offset = offset;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Override ByteBuffer.get(byte[], int, int) to improve performance.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * (non-Javadoc)
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.nio.ByteBuffer#get(byte[], int, int)
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final ByteBuffer get(byte[] dest, int off, int len) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = dest.length;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((off < 0 ) || (len < 0) || (long)off + (long)len > length) {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (len > remaining()) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        getBaseAddress().getByteArray(offset+position, dest, off, len);
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position += len;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final byte get() {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == limit) {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getByte(offset + position++);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final byte get(int index) {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || index >= limit) {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getByte(offset + index);
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final double getDouble() {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int newPosition = position + 8;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        double result = getBaseAddress().getDouble(offset + position, order);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final double getDouble(int index) {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || (long)index + 8 > limit) {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getDouble(offset + index, order);
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final float getFloat() {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int newPosition = position + 4;
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        float result = getBaseAddress().getFloat(offset + position, order);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final float getFloat(int index) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || (long)index + 4 > limit) {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getFloat(offset + index, order);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int getInt() {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int newPosition = position + 4;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int result = getBaseAddress().getInt(offset + position, order);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int getInt(int index) {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || (long)index + 4 > limit) {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getInt(offset + index, order);
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final long getLong() {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int newPosition = position + 8;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = getBaseAddress().getLong(offset + position, order);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final long getLong(int index) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || (long)index + 8 > limit) {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getLong(offset + index, order);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final short getShort() {
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int newPosition = position + 2;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        short result = getBaseAddress().getShort(offset + position, order);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final short getShort(int index) {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || (long)index + 2 > limit) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IndexOutOfBoundsException();
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().getShort(offset + index, order);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isDirect() {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isAddressValid() {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return safeAddress.isValid;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void addressValidityCheck() {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isAddressValid()) {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // nio.08=Cannot use the direct byte buffer after it has been explicitly freed.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Messages.getString("nio.08"));  //$NON-NLS-1$
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void markAddressInvalid() {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        safeAddress.isValid = false;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the base address of the buffer (i.e. before offset).
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final PlatformAddress getBaseAddress() {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        addressValidityCheck();
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return safeAddress.address;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the platform address of the start of this buffer instance.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <em>You must not attempt to free the returned address!!</em> It may not
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be an address that was explicitly malloc'ed (i.e. if this buffer is the
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * result of a split); and it may be memory shared by multiple buffers.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If you can guarantee that you want to free the underlying memory call the
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * #free() method on this instance -- generally applications will rely on
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the garbage collector to autofree this memory.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the effective address of the start of the buffer.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this buffer address is known to have been freed
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             previously.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final PlatformAddress getEffectiveAddress() {
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getBaseAddress().offsetBytes(offset);
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Explicitly free the memory used by this direct byte buffer. If the memory
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * has already been freed then this is a no-op. Once the memory has been
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * freed then operations requiring access to the memory will throw an
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>IllegalStateException</code>.
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Note this is is possible that the memory is freed by code that reaches
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * into the address and explicitly frees it 'beneith' us -- this is bad
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * form.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void free() {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isAddressValid()) {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            markAddressInvalid();
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            safeAddress.address.free();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final protected byte[] protectedArray() {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final protected int protectedArrayOffset() {
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final protected boolean protectedHasArray() {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-added
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // copied from newer version of harmony
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int getByteCapacity() {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return capacity;
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-added
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
290