xref: /AOO41X/main/package/qa/storages/BorderedStream.java (revision a740f2aac71e58ccad9369fb423cc251ef909663)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 package complex.storages;
23 
24 import com.sun.star.uno.XInterface;
25 import com.sun.star.lang.XMultiServiceFactory;
26 import com.sun.star.lang.XSingleServiceFactory;
27 
28 import com.sun.star.bridge.XUnoUrlResolver;
29 import com.sun.star.uno.UnoRuntime;
30 import com.sun.star.uno.XInterface;
31 
32 import com.sun.star.io.XStream;
33 import com.sun.star.io.XInputStream;
34 import com.sun.star.io.XOutputStream;
35 import com.sun.star.io.XTruncate;
36 import com.sun.star.io.XSeekable;
37 
38 
39 public class BorderedStream
40     implements XStream, XInputStream, XOutputStream, XTruncate, XSeekable
41 {
42     int m_nMaxSize;
43     int m_nCurSize;
44     int m_nCurPos;
45     byte m_pBytes[];
46 
BorderedStream( int nMaxSize )47     public BorderedStream( int nMaxSize )
48     {
49         m_nMaxSize = nMaxSize;
50         m_nCurSize = 0;
51         m_nCurPos = 0;
52         m_pBytes = new byte[m_nMaxSize];
53     }
54 
55     //==============
56     // XStream
57     //==============
58 
59     // ----------------------------------------------------------
getInputStream()60     public synchronized XInputStream getInputStream()
61         throws com.sun.star.uno.RuntimeException
62     {
63         return (XInputStream)UnoRuntime.queryInterface( XInputStream.class, this );
64     }
65 
66     // ----------------------------------------------------------
getOutputStream()67     public synchronized XOutputStream getOutputStream()
68         throws com.sun.star.uno.RuntimeException
69     {
70         return (XOutputStream)UnoRuntime.queryInterface( XOutputStream.class, this );
71     }
72 
73     //==============
74     // XInputStream
75     //==============
76 
77     // ----------------------------------------------------------
readBytes( byte[][] aData, int nBytesToRead )78     public synchronized int readBytes( byte[][] aData, int nBytesToRead )
79         throws  com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
80     {
81         int nRead = 0;
82         if ( m_pBytes != null && nBytesToRead > 0 )
83         {
84             int nAvailable = m_nCurSize - m_nCurPos;
85             if ( nBytesToRead > nAvailable )
86                 nBytesToRead = nAvailable;
87 
88             aData[0] = new byte[nBytesToRead];
89             for ( int nInd = 0; nInd < nBytesToRead; nInd++ )
90                 aData[0][nInd] = m_pBytes[m_nCurPos+nInd];
91 
92             nRead = nBytesToRead;
93             m_nCurPos += nRead;
94         }
95         else
96         {
97             aData[0] = new byte[0];
98         }
99 
100         return nRead;
101     }
102 
103     // ----------------------------------------------------------
readSomeBytes( byte[][] aData, int nMaxBytesToRead )104     public synchronized int readSomeBytes( byte[][] aData, int nMaxBytesToRead )
105         throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
106     {
107         return readBytes( aData, nMaxBytesToRead );
108     }
109 
110     // ----------------------------------------------------------
skipBytes( int nBytesToSkip )111     public synchronized void skipBytes( int nBytesToSkip  )
112         throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
113     {
114         if ( nBytesToSkip < 0 )
115             throw new com.sun.star.io.IOException(); // illegal argument
116 
117         if ( m_nCurSize - m_nCurPos > nBytesToSkip )
118             m_nCurPos += nBytesToSkip;
119         else
120             m_nCurPos = m_nCurSize;
121     }
122 
123     // ----------------------------------------------------------
available()124     public synchronized int available()
125         throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
126     {
127         return 0;
128     }
129 
130     // ----------------------------------------------------------
closeInput()131     public synchronized void closeInput()
132         throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
133     {
134         // no need to do anything
135     }
136 
137 
138     //==============
139     // XOutputStream
140     //==============
141 
142     // ----------------------------------------------------------
writeBytes( byte[] aData )143     public synchronized void writeBytes( byte[] aData  )
144         throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
145     {
146         if ( m_pBytes != null && aData.length > 0 )
147         {
148             if ( aData.length > m_nMaxSize - m_nCurPos )
149                 throw new com.sun.star.io.IOException();
150 
151             for ( int nInd = 0; nInd < aData.length; nInd++ )
152                 m_pBytes[m_nCurPos+nInd] = aData[nInd];
153 
154             m_nCurPos += aData.length;
155             if ( m_nCurPos > m_nCurSize )
156                 m_nCurSize = m_nCurPos;
157         }
158     }
159 
160     // ----------------------------------------------------------
flush()161     public synchronized void flush()
162         throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
163     {
164         // nothing to do
165     }
166 
167     // ----------------------------------------------------------
closeOutput()168     public synchronized void closeOutput()
169         throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
170     {
171         // nothing to do
172     }
173 
174 
175     //==============
176     // XTruncate
177     //==============
178 
179     // ----------------------------------------------------------
truncate()180     public synchronized void truncate()
181         throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
182     {
183         m_nCurSize = 0;
184         m_nCurPos = 0;
185     }
186 
187 
188     //==============
189     // XSeekable
190     //==============
191 
192     // ----------------------------------------------------------
seek( long location )193     public synchronized void seek( long location )
194         throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
195     {
196         if ( location > (long)m_nCurSize )
197             throw new com.sun.star.lang.IllegalArgumentException();
198 
199         m_nCurPos = (int)location;
200     }
201 
202     // ----------------------------------------------------------
getPosition()203     public synchronized long getPosition()
204         throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
205     {
206         return (long)m_nCurPos;
207     }
208 
209     // ----------------------------------------------------------
getLength()210     public synchronized long getLength()
211         throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
212     {
213         return (long)m_nCurSize;
214     }
215 };
216 
217