xref: /trunk/main/xmlhelp/source/cxxhelp/provider/inputstream.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 
29 // MARKER(update_precomp.py): autogen include statement, do not remove
30 #include "precompiled_xmlhelp.hxx"
31 #include "inputstream.hxx"
32 
33 
34 using namespace chelp;
35 using namespace com::sun::star;
36 using namespace com::sun::star::ucb;
37 
38 
39 
40 XInputStream_impl::XInputStream_impl( const rtl::OUString& aUncPath )
41     : m_bIsOpen( false ),
42       m_aFile( aUncPath )
43 {
44     m_bIsOpen = ( osl::FileBase::E_None == m_aFile.open( OpenFlag_Read ) );
45 }
46 
47 
48 XInputStream_impl::~XInputStream_impl()
49 {
50     closeInput();
51 }
52 
53 
54 bool SAL_CALL XInputStream_impl::CtorSuccess()
55 {
56     return m_bIsOpen;
57 };
58 
59 
60 uno::Any SAL_CALL
61 XInputStream_impl::queryInterface(
62     const uno::Type& rType )
63     throw( uno::RuntimeException)
64 {
65     uno::Any aRet = cppu::queryInterface( rType,
66                                           SAL_STATIC_CAST( io::XInputStream*,this ),
67                                           SAL_STATIC_CAST( io::XSeekable*,this ) );
68     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
69 }
70 
71 
72 void SAL_CALL
73 XInputStream_impl::acquire(
74     void )
75     throw()
76 {
77     OWeakObject::acquire();
78 }
79 
80 
81 void SAL_CALL
82 XInputStream_impl::release(
83     void )
84     throw()
85 {
86     OWeakObject::release();
87 }
88 
89 
90 
91 sal_Int32 SAL_CALL
92 XInputStream_impl::readBytes(
93                  uno::Sequence< sal_Int8 >& aData,
94                  sal_Int32 nBytesToRead )
95     throw( io::NotConnectedException,
96            io::BufferSizeExceededException,
97            io::IOException,
98            uno::RuntimeException)
99 {
100     if( ! m_bIsOpen )
101         throw io::IOException();
102 
103     aData.realloc(nBytesToRead);
104     //TODO! translate memory exhaustion (if it were detectable...) into
105     // io::BufferSizeExceededException
106 
107     sal_uInt64 nrc;
108     m_aFile.read( aData.getArray(),sal_uInt64(nBytesToRead),nrc );
109 
110     // Shrink aData in case we read less than nBytesToRead (XInputStream
111     // documentation does not tell whether this is required, and I do not know
112     // if any code relies on this, so be conservative---SB):
113     if (nrc != sal::static_int_cast<sal_uInt64>( nBytesToRead) )
114         aData.realloc(sal_Int32(nrc));
115     return ( sal_Int32 ) nrc;
116 }
117 
118 sal_Int32 SAL_CALL
119 XInputStream_impl::readSomeBytes(
120     uno::Sequence< sal_Int8 >& aData,
121     sal_Int32 nMaxBytesToRead )
122     throw( io::NotConnectedException,
123            io::BufferSizeExceededException,
124            io::IOException,
125            uno::RuntimeException)
126 {
127     return readBytes( aData,nMaxBytesToRead );
128 }
129 
130 
131 void SAL_CALL
132 XInputStream_impl::skipBytes(
133     sal_Int32 nBytesToSkip )
134     throw( io::NotConnectedException,
135            io::BufferSizeExceededException,
136            io::IOException,
137            uno::RuntimeException)
138 {
139     m_aFile.setPos( osl_Pos_Current, sal_uInt64( nBytesToSkip ) );
140 }
141 
142 
143 sal_Int32 SAL_CALL
144 XInputStream_impl::available(
145     void )
146     throw( io::NotConnectedException,
147            io::IOException,
148            uno::RuntimeException)
149 {
150     return 0;
151 }
152 
153 
154 void SAL_CALL
155 XInputStream_impl::closeInput(
156     void )
157     throw( io::NotConnectedException,
158            io::IOException,
159            uno::RuntimeException )
160 {
161     if( m_bIsOpen )
162     {
163         osl::FileBase::RC err = m_aFile.close();
164         if( err != osl::FileBase::E_None )
165             throw io::IOException();
166         m_bIsOpen = false;
167     }
168 }
169 
170 
171 void SAL_CALL
172 XInputStream_impl::seek(
173     sal_Int64 location )
174     throw( lang::IllegalArgumentException,
175            io::IOException,
176            uno::RuntimeException )
177 {
178     if( location < 0 )
179         throw lang::IllegalArgumentException();
180     if( osl::FileBase::E_None != m_aFile.setPos( Pos_Absolut, sal_uInt64( location ) ) )
181         throw io::IOException();
182 }
183 
184 
185 sal_Int64 SAL_CALL
186 XInputStream_impl::getPosition(
187     void )
188     throw( io::IOException,
189            uno::RuntimeException )
190 {
191     sal_uInt64 uPos;
192     if( osl::FileBase::E_None != m_aFile.getPos( uPos ) )
193         throw io::IOException();
194     return sal_Int64( uPos );
195 }
196 
197 sal_Int64 SAL_CALL
198 XInputStream_impl::getLength(
199     void )
200     throw( io::IOException,
201            uno::RuntimeException )
202 {
203     osl::FileBase::RC   err;
204     sal_uInt64          uCurrentPos, uEndPos;
205 
206     err = m_aFile.getPos( uCurrentPos );
207     if( err != osl::FileBase::E_None )
208         throw io::IOException();
209 
210     err = m_aFile.setPos( Pos_End, 0 );
211     if( err != osl::FileBase::E_None )
212         throw io::IOException();
213 
214     err = m_aFile.getPos( uEndPos );
215     if( err != osl::FileBase::E_None )
216         throw io::IOException();
217 
218     err = m_aFile.setPos( Pos_Absolut, uCurrentPos );
219     if( err != osl::FileBase::E_None )
220         throw io::IOException();
221     else
222         return sal_Int64( uEndPos );
223 }
224