xref: /AOO41X/main/xmlhelp/source/cxxhelp/provider/inputstream.cxx (revision 89dcb3da00a29b2b7b028d5bd430e2099844a09e)
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 
23 
24 
25 // MARKER(update_precomp.py): autogen include statement, do not remove
26 #include "precompiled_xmlhelp.hxx"
27 #include "inputstream.hxx"
28 
29 
30 using namespace chelp;
31 using namespace com::sun::star;
32 using namespace com::sun::star::ucb;
33 
34 
35 
XInputStream_impl(const rtl::OUString & aUncPath)36 XInputStream_impl::XInputStream_impl( const rtl::OUString& aUncPath )
37     : m_bIsOpen( false ),
38       m_aFile( aUncPath )
39 {
40     m_bIsOpen = ( osl::FileBase::E_None == m_aFile.open( OpenFlag_Read ) );
41 }
42 
43 
~XInputStream_impl()44 XInputStream_impl::~XInputStream_impl()
45 {
46     closeInput();
47 }
48 
49 
CtorSuccess()50 bool SAL_CALL XInputStream_impl::CtorSuccess()
51 {
52     return m_bIsOpen;
53 };
54 
55 
56 uno::Any SAL_CALL
queryInterface(const uno::Type & rType)57 XInputStream_impl::queryInterface(
58     const uno::Type& rType )
59     throw( uno::RuntimeException)
60 {
61     uno::Any aRet = cppu::queryInterface( rType,
62                                           SAL_STATIC_CAST( io::XInputStream*,this ),
63                                           SAL_STATIC_CAST( io::XSeekable*,this ) );
64     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
65 }
66 
67 
68 void SAL_CALL
acquire(void)69 XInputStream_impl::acquire(
70     void )
71     throw()
72 {
73     OWeakObject::acquire();
74 }
75 
76 
77 void SAL_CALL
release(void)78 XInputStream_impl::release(
79     void )
80     throw()
81 {
82     OWeakObject::release();
83 }
84 
85 
86 
87 sal_Int32 SAL_CALL
readBytes(uno::Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)88 XInputStream_impl::readBytes(
89                  uno::Sequence< sal_Int8 >& aData,
90                  sal_Int32 nBytesToRead )
91     throw( io::NotConnectedException,
92            io::BufferSizeExceededException,
93            io::IOException,
94            uno::RuntimeException)
95 {
96     if( ! m_bIsOpen )
97         throw io::IOException();
98 
99     aData.realloc(nBytesToRead);
100     //TODO! translate memory exhaustion (if it were detectable...) into
101     // io::BufferSizeExceededException
102 
103     sal_uInt64 nrc;
104     m_aFile.read( aData.getArray(),sal_uInt64(nBytesToRead),nrc );
105 
106     // Shrink aData in case we read less than nBytesToRead (XInputStream
107     // documentation does not tell whether this is required, and I do not know
108     // if any code relies on this, so be conservative---SB):
109     if (nrc != sal::static_int_cast<sal_uInt64>( nBytesToRead) )
110         aData.realloc(sal_Int32(nrc));
111     return ( sal_Int32 ) nrc;
112 }
113 
114 sal_Int32 SAL_CALL
readSomeBytes(uno::Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)115 XInputStream_impl::readSomeBytes(
116     uno::Sequence< sal_Int8 >& aData,
117     sal_Int32 nMaxBytesToRead )
118     throw( io::NotConnectedException,
119            io::BufferSizeExceededException,
120            io::IOException,
121            uno::RuntimeException)
122 {
123     return readBytes( aData,nMaxBytesToRead );
124 }
125 
126 
127 void SAL_CALL
skipBytes(sal_Int32 nBytesToSkip)128 XInputStream_impl::skipBytes(
129     sal_Int32 nBytesToSkip )
130     throw( io::NotConnectedException,
131            io::BufferSizeExceededException,
132            io::IOException,
133            uno::RuntimeException)
134 {
135     m_aFile.setPos( osl_Pos_Current, sal_uInt64( nBytesToSkip ) );
136 }
137 
138 
139 sal_Int32 SAL_CALL
available(void)140 XInputStream_impl::available(
141     void )
142     throw( io::NotConnectedException,
143            io::IOException,
144            uno::RuntimeException)
145 {
146     return 0;
147 }
148 
149 
150 void SAL_CALL
closeInput(void)151 XInputStream_impl::closeInput(
152     void )
153     throw( io::NotConnectedException,
154            io::IOException,
155            uno::RuntimeException )
156 {
157     if( m_bIsOpen )
158     {
159         osl::FileBase::RC err = m_aFile.close();
160         if( err != osl::FileBase::E_None )
161             throw io::IOException();
162         m_bIsOpen = false;
163     }
164 }
165 
166 
167 void SAL_CALL
seek(sal_Int64 location)168 XInputStream_impl::seek(
169     sal_Int64 location )
170     throw( lang::IllegalArgumentException,
171            io::IOException,
172            uno::RuntimeException )
173 {
174     if( location < 0 )
175         throw lang::IllegalArgumentException();
176     if( osl::FileBase::E_None != m_aFile.setPos( Pos_Absolut, sal_uInt64( location ) ) )
177         throw io::IOException();
178 }
179 
180 
181 sal_Int64 SAL_CALL
getPosition(void)182 XInputStream_impl::getPosition(
183     void )
184     throw( io::IOException,
185            uno::RuntimeException )
186 {
187     sal_uInt64 uPos;
188     if( osl::FileBase::E_None != m_aFile.getPos( uPos ) )
189         throw io::IOException();
190     return sal_Int64( uPos );
191 }
192 
193 sal_Int64 SAL_CALL
getLength(void)194 XInputStream_impl::getLength(
195     void )
196     throw( io::IOException,
197            uno::RuntimeException )
198 {
199     osl::FileBase::RC   err;
200     sal_uInt64          uCurrentPos, uEndPos;
201 
202     err = m_aFile.getPos( uCurrentPos );
203     if( err != osl::FileBase::E_None )
204         throw io::IOException();
205 
206     err = m_aFile.setPos( Pos_End, 0 );
207     if( err != osl::FileBase::E_None )
208         throw io::IOException();
209 
210     err = m_aFile.getPos( uEndPos );
211     if( err != osl::FileBase::E_None )
212         throw io::IOException();
213 
214     err = m_aFile.setPos( Pos_Absolut, uCurrentPos );
215     if( err != osl::FileBase::E_None )
216         throw io::IOException();
217     else
218         return sal_Int64( uEndPos );
219 }
220