1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2012 Sebastian Annies, Hamburg
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the License);
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * you may not use this file except in compliance with the License.
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * You may obtain a copy of the License at
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *     http://www.apache.org/licenses/LICENSE-2.0
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * distributed under the License is distributed on an AS IS BASIS,
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * See the License for the specific language governing permissions and
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * limitations under the License.
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.util;
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.EOFException;
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException;
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.channels.ByteChannel;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Creates a <code>ReadableByteChannel</code> that is backed by a <code>ByteBuffer</code>.
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ByteBufferByteChannel implements ByteChannel {
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    ByteBuffer byteBuffer;
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public ByteBufferByteChannel(ByteBuffer byteBuffer) {
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.byteBuffer = byteBuffer;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int read(ByteBuffer dst) throws IOException {
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byte[] b = dst.array();
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int r = dst.remaining();
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (byteBuffer.remaining() >= r) {
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            byteBuffer.get(b, dst.position(), r);
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return r;
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        } else {
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            throw new EOFException("Reading beyond end of stream");
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean isOpen() {
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return true;
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void close() throws IOException {
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int write(ByteBuffer src) throws IOException {
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int r = src.remaining();
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.put(src);
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return r;
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
57