• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package javax.imageio.stream;
19 
20 import org.apache.harmony.x.imageio.stream.RandomAccessMemoryCache;
21 
22 import java.io.IOException;
23 import java.io.InputStream;
24 
25 /**
26  * The MemoryCacheImageInputStream class implements ImageInputStream using a
27  * memory buffer for caching the data.
28  *
29  * @since Android 1.0
30  */
31 public class MemoryCacheImageInputStream extends ImageInputStreamImpl {
32 
33     /**
34      * The is.
35      */
36     private InputStream is;
37 
38     /**
39      * The ramc.
40      */
41     private RandomAccessMemoryCache ramc = new RandomAccessMemoryCache();
42 
43     /**
44      * Instantiates a new MemoryCacheImageInputStream which reads from the
45      * specified InputStream.
46      *
47      * @param stream
48      *            the InputStream to be read.
49      */
MemoryCacheImageInputStream(InputStream stream)50     public MemoryCacheImageInputStream(InputStream stream) {
51         if (stream == null) {
52             throw new IllegalArgumentException("stream == null!");
53         }
54         is = stream;
55     }
56 
57     @Override
read()58     public int read() throws IOException {
59         bitOffset = 0;
60 
61         if (streamPos >= ramc.length()) {
62             int count = (int)(streamPos - ramc.length() + 1);
63             int bytesAppended = ramc.appendData(is, count);
64 
65             if (bytesAppended < count) {
66                 return -1;
67             }
68         }
69 
70         int res = ramc.getData(streamPos);
71         if (res >= 0) {
72             streamPos++;
73         }
74         return res;
75     }
76 
77     @Override
read(byte[] b, int off, int len)78     public int read(byte[] b, int off, int len) throws IOException {
79         bitOffset = 0;
80 
81         if (streamPos >= ramc.length()) {
82             int count = (int)(streamPos - ramc.length() + len);
83             ramc.appendData(is, count);
84         }
85 
86         int res = ramc.getData(b, off, len, streamPos);
87         if (res > 0) {
88             streamPos += res;
89         }
90         return res;
91     }
92 
93     @Override
isCached()94     public boolean isCached() {
95         return true;
96     }
97 
98     @Override
isCachedFile()99     public boolean isCachedFile() {
100         return false;
101     }
102 
103     @Override
isCachedMemory()104     public boolean isCachedMemory() {
105         return true;
106     }
107 
108     @Override
close()109     public void close() throws IOException {
110         super.close();
111         ramc.close();
112     }
113 
114     @Override
flushBefore(long pos)115     public void flushBefore(long pos) throws IOException {
116         super.flushBefore(pos);
117         ramc.freeBefore(getFlushedPosition());
118     }
119 }
120