1 package complex.storages;
2 
3 import com.sun.star.uno.XInterface;
4 import com.sun.star.lang.XMultiServiceFactory;
5 import com.sun.star.lang.XSingleServiceFactory;
6 
7 import com.sun.star.bridge.XUnoUrlResolver;
8 import com.sun.star.uno.UnoRuntime;
9 import com.sun.star.uno.XInterface;
10 
11 import com.sun.star.io.XStream;
12 import com.sun.star.io.XInputStream;
13 import com.sun.star.io.XOutputStream;
14 import com.sun.star.io.XTruncate;
15 import com.sun.star.io.XSeekable;
16 
17 
18 public class BorderedStream
19 	implements XStream, XInputStream, XOutputStream, XTruncate, XSeekable
20 {
21 	int m_nMaxSize;
22 	int m_nCurSize;
23 	int m_nCurPos;
24 	byte m_pBytes[];
25 
26 	public BorderedStream( int nMaxSize )
27 	{
28 		m_nMaxSize = nMaxSize;
29 		m_nCurSize = 0;
30 		m_nCurPos = 0;
31 		m_pBytes = new byte[m_nMaxSize];
32 	}
33 
34 	//==============
35 	// XStream
36 	//==============
37 
38 	// ----------------------------------------------------------
39 	public synchronized XInputStream getInputStream()
40 		throws com.sun.star.uno.RuntimeException
41 	{
42 		return (XInputStream)UnoRuntime.queryInterface( XInputStream.class, this );
43 	}
44 
45 	// ----------------------------------------------------------
46 	public synchronized XOutputStream getOutputStream()
47 		throws com.sun.star.uno.RuntimeException
48 	{
49 		return (XOutputStream)UnoRuntime.queryInterface( XOutputStream.class, this );
50 	}
51 
52 	//==============
53 	// XInputStream
54 	//==============
55 
56 	// ----------------------------------------------------------
57 	public synchronized int readBytes( byte[][] aData, int nBytesToRead )
58     	throws  com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
59 	{
60 		int nRead = 0;
61 		if ( m_pBytes != null && nBytesToRead > 0 )
62 		{
63 			int nAvailable = m_nCurSize - m_nCurPos;
64 			if ( nBytesToRead > nAvailable )
65 				nBytesToRead = nAvailable;
66 
67 			aData[0] = new byte[nBytesToRead];
68 			for ( int nInd = 0; nInd < nBytesToRead; nInd++ )
69 				aData[0][nInd] = m_pBytes[m_nCurPos+nInd];
70 
71 			nRead = nBytesToRead;
72 			m_nCurPos += nRead;
73 		}
74 		else
75 		{
76 			aData[0] = new byte[0];
77 		}
78 
79 		return nRead;
80 	}
81 
82     // ----------------------------------------------------------
83 	public synchronized int readSomeBytes( byte[][] aData, int nMaxBytesToRead )
84 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
85 	{
86 		return readBytes( aData, nMaxBytesToRead );
87 	}
88 
89     // ----------------------------------------------------------
90 	public synchronized void skipBytes( int nBytesToSkip  )
91 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
92 	{
93 		if ( nBytesToSkip < 0 )
94 			throw new com.sun.star.io.IOException(); // illegal argument
95 
96 		if ( m_nCurSize - m_nCurPos > nBytesToSkip )
97 			m_nCurPos += nBytesToSkip;
98 		else
99 			m_nCurPos = m_nCurSize;
100 	}
101 
102     // ----------------------------------------------------------
103 	public synchronized int available()
104 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
105 	{
106 		return 0;
107 	}
108 
109     // ----------------------------------------------------------
110 	public synchronized void closeInput()
111 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
112 	{
113 		// no need to do anything
114 	}
115 
116 
117 	//==============
118 	// XOutputStream
119 	//==============
120 
121     // ----------------------------------------------------------
122 	public synchronized void writeBytes( byte[] aData  )
123 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
124 	{
125 		if ( m_pBytes != null && aData.length > 0 )
126 		{
127 			if ( aData.length > m_nMaxSize - m_nCurPos )
128 				throw new com.sun.star.io.IOException();
129 
130 			for ( int nInd = 0; nInd < aData.length; nInd++ )
131 				m_pBytes[m_nCurPos+nInd] = aData[nInd];
132 
133 			m_nCurPos += aData.length;
134 			if ( m_nCurPos > m_nCurSize )
135 				m_nCurSize = m_nCurPos;
136 		}
137 	}
138 
139     // ----------------------------------------------------------
140 	public synchronized void flush()
141 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
142 	{
143 		// nothing to do
144 	}
145 
146     // ----------------------------------------------------------
147 	public synchronized void closeOutput()
148 		throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
149 	{
150 		// nothing to do
151 	}
152 
153 
154 	//==============
155 	// XTruncate
156 	//==============
157 
158     // ----------------------------------------------------------
159 	public synchronized void truncate()
160 		throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
161 	{
162 		m_nCurSize = 0;
163 		m_nCurPos = 0;
164 	}
165 
166 
167 	//==============
168 	// XSeekable
169 	//==============
170 
171     // ----------------------------------------------------------
172 	public synchronized void seek( long location )
173 		throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
174 	{
175 		if ( location > (long)m_nCurSize )
176 			throw new com.sun.star.lang.IllegalArgumentException();
177 
178 		m_nCurPos = (int)location;
179 	}
180 
181     // ----------------------------------------------------------
182 	public synchronized long getPosition()
183 		throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
184 	{
185 		return (long)m_nCurPos;
186 	}
187 
188     // ----------------------------------------------------------
189 	public synchronized long getLength()
190 		throws com.sun.star.io.IOException, com.sun.star.uno.RuntimeException
191 	{
192 		return (long)m_nCurSize;
193 	}
194 };
195 
196