Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : // MARKER( update_precomp.py ): autogen include statement, do not remove
21 : :
22 : : #include "comphelper_module.hxx"
23 : :
24 : : #include <sal/config.h>
25 : : #include <osl/mutex.hxx>
26 : : #include <cppuhelper/factory.hxx>
27 : : #include <cppuhelper/implementationentry.hxx>
28 : : #include <cppuhelper/implbase3.hxx>
29 : : #include <comphelper/seqstream.hxx>
30 : : #include <com/sun/star/lang/XServiceInfo.hpp>
31 : : #include <com/sun/star/io/XSeekableInputStream.hpp>
32 : : #include <com/sun/star/lang/XInitialization.hpp>
33 : : #include <com/sun/star/frame/DoubleInitializationException.hpp>
34 : : #include <com/sun/star/uno/XComponentContext.hpp>
35 : :
36 : :
37 : : using namespace ::com::sun::star;
38 : :
39 : : namespace {
40 : :
41 : : class SequenceInputStreamService:
42 : : public ::cppu::WeakImplHelper3<
43 : : lang::XServiceInfo,
44 : : io::XSeekableInputStream,
45 : : lang::XInitialization>
46 : : {
47 : : public:
48 : : explicit SequenceInputStreamService();
49 : :
50 : : // ::com::sun::star::lang::XServiceInfo:
51 : : virtual ::rtl::OUString SAL_CALL getImplementationName() throw ( uno::RuntimeException );
52 : : virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString & ServiceName ) throw ( uno::RuntimeException );
53 : : virtual uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw ( uno::RuntimeException );
54 : :
55 : : // XServiceInfo - static versions (used for component registration)
56 : : static ::rtl::OUString SAL_CALL getImplementationName_static();
57 : : static uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static();
58 : : static uno::Reference< uno::XInterface > SAL_CALL Create( const uno::Reference< uno::XComponentContext >& );
59 : :
60 : : // ::com::sun::star::io::XInputStream:
61 : : virtual ::sal_Int32 SAL_CALL readBytes( uno::Sequence< ::sal_Int8 > & aData, ::sal_Int32 nBytesToRead ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException );
62 : : virtual ::sal_Int32 SAL_CALL readSomeBytes( uno::Sequence< ::sal_Int8 > & aData, ::sal_Int32 nMaxBytesToRead ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException );
63 : : virtual void SAL_CALL skipBytes( ::sal_Int32 nBytesToSkip ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException );
64 : : virtual ::sal_Int32 SAL_CALL available() throw ( uno::RuntimeException, io::NotConnectedException, io::IOException );
65 : : virtual void SAL_CALL closeInput() throw ( uno::RuntimeException, io::NotConnectedException, io::IOException );
66 : :
67 : : // ::com::sun::star::io::XSeekable:
68 : : virtual void SAL_CALL seek( ::sal_Int64 location ) throw ( uno::RuntimeException, lang::IllegalArgumentException, io::IOException );
69 : : virtual ::sal_Int64 SAL_CALL getPosition() throw ( uno::RuntimeException, io::IOException );
70 : : virtual ::sal_Int64 SAL_CALL getLength() throw ( uno::RuntimeException, io::IOException );
71 : :
72 : : // ::com::sun::star::lang::XInitialization:
73 : : virtual void SAL_CALL initialize( const uno::Sequence< ::com::sun::star::uno::Any > & aArguments ) throw ( uno::RuntimeException, uno::Exception );
74 : :
75 : : private:
76 : : SequenceInputStreamService( SequenceInputStreamService & ); // not defined
77 : : void operator =( SequenceInputStreamService & ); // not defined
78 : :
79 [ + - ][ - + ]: 4 : virtual ~SequenceInputStreamService() {}
80 : :
81 : :
82 : : ::osl::Mutex m_aMutex;
83 : : sal_Bool m_bInitialized;
84 : : uno::Reference< io::XInputStream > m_xInputStream;
85 : : uno::Reference< io::XSeekable > m_xSeekable;
86 : : };
87 : :
88 : 2 : SequenceInputStreamService::SequenceInputStreamService()
89 [ + - ]: 2 : : m_bInitialized( sal_False )
90 : 2 : {}
91 : :
92 : : // com.sun.star.uno.XServiceInfo:
93 : 0 : ::rtl::OUString SAL_CALL SequenceInputStreamService::getImplementationName() throw ( uno::RuntimeException )
94 : : {
95 : 0 : return getImplementationName_static();
96 : : }
97 : :
98 : 227 : ::rtl::OUString SAL_CALL SequenceInputStreamService::getImplementationName_static()
99 : : {
100 : 227 : return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.SequenceInputStreamService" ) );
101 : : }
102 : :
103 : 0 : ::sal_Bool SAL_CALL SequenceInputStreamService::supportsService( ::rtl::OUString const & serviceName ) throw ( uno::RuntimeException )
104 : : {
105 [ # # ]: 0 : uno::Sequence< ::rtl::OUString > serviceNames = getSupportedServiceNames();
106 [ # # ]: 0 : for ( ::sal_Int32 i = 0; i < serviceNames.getLength(); ++i ) {
107 [ # # ][ # # ]: 0 : if ( serviceNames[i] == serviceName )
108 : 0 : return sal_True;
109 : : }
110 [ # # ]: 0 : return sal_False;
111 : : }
112 : :
113 : 0 : uno::Sequence< ::rtl::OUString > SAL_CALL SequenceInputStreamService::getSupportedServiceNames() throw ( uno::RuntimeException )
114 : : {
115 : 0 : return getSupportedServiceNames_static();
116 : : }
117 : :
118 : 227 : uno::Sequence< ::rtl::OUString > SAL_CALL SequenceInputStreamService::getSupportedServiceNames_static()
119 : : {
120 : 227 : uno::Sequence< ::rtl::OUString > s( 1 );
121 [ + - ]: 227 : s[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
122 [ + - ]: 454 : "com.sun.star.io.SequenceInputStream" ) );
123 : 227 : return s;
124 : : }
125 : :
126 : 2 : uno::Reference< uno::XInterface > SAL_CALL SequenceInputStreamService::Create(
127 : : SAL_UNUSED_PARAMETER const uno::Reference< uno::XComponentContext >& )
128 : : {
129 [ + - ]: 2 : return static_cast< ::cppu::OWeakObject * >( new SequenceInputStreamService() );
130 : : }
131 : :
132 : : // ::com::sun::star::io::XInputStream:
133 : 2 : ::sal_Int32 SAL_CALL SequenceInputStreamService::readBytes( uno::Sequence< ::sal_Int8 > & aData, ::sal_Int32 nBytesToRead ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException )
134 : : {
135 [ + - ]: 2 : ::osl::MutexGuard aGuard( m_aMutex );
136 [ - + ]: 2 : if ( !m_xInputStream.is() )
137 [ # # ]: 0 : throw io::NotConnectedException();
138 : :
139 [ + - ][ + - ]: 2 : return m_xInputStream->readBytes( aData, nBytesToRead );
[ + - ]
140 : : }
141 : :
142 : 0 : ::sal_Int32 SAL_CALL SequenceInputStreamService::readSomeBytes( uno::Sequence< ::sal_Int8 > & aData, ::sal_Int32 nMaxBytesToRead ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException )
143 : : {
144 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
145 [ # # ]: 0 : if ( !m_xInputStream.is() )
146 [ # # ]: 0 : throw io::NotConnectedException();
147 : :
148 [ # # ][ # # ]: 0 : return m_xInputStream->readSomeBytes( aData, nMaxBytesToRead );
[ # # ]
149 : : }
150 : :
151 : 0 : void SAL_CALL SequenceInputStreamService::skipBytes( ::sal_Int32 nBytesToSkip ) throw ( uno::RuntimeException, io::NotConnectedException, io::BufferSizeExceededException, io::IOException )
152 : : {
153 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
154 [ # # ]: 0 : if ( !m_xInputStream.is() )
155 [ # # ]: 0 : throw io::NotConnectedException();
156 : :
157 [ # # ][ # # ]: 0 : return m_xInputStream->skipBytes( nBytesToSkip );
[ # # ]
158 : : }
159 : :
160 : 0 : ::sal_Int32 SAL_CALL SequenceInputStreamService::available() throw ( uno::RuntimeException, io::NotConnectedException, io::IOException )
161 : : {
162 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
163 [ # # ]: 0 : if ( !m_xInputStream.is() )
164 [ # # ]: 0 : throw io::NotConnectedException();
165 : :
166 [ # # ][ # # ]: 0 : return m_xInputStream->available();
[ # # ]
167 : : }
168 : :
169 : 2 : void SAL_CALL SequenceInputStreamService::closeInput() throw ( uno::RuntimeException, io::NotConnectedException, io::IOException )
170 : : {
171 [ + - ]: 2 : ::osl::MutexGuard aGuard( m_aMutex );
172 [ - + ]: 2 : if ( !m_xInputStream.is() )
173 [ # # ]: 0 : throw io::NotConnectedException();
174 : :
175 [ + - ][ + - ]: 2 : m_xInputStream->closeInput();
176 [ + - ]: 2 : m_xInputStream = uno::Reference< io::XInputStream >();
177 [ + - ][ + - ]: 2 : m_xSeekable = uno::Reference< io::XSeekable >();
178 : 2 : }
179 : :
180 : : // ::com::sun::star::io::XSeekable:
181 : 0 : void SAL_CALL SequenceInputStreamService::seek( ::sal_Int64 location ) throw ( uno::RuntimeException, lang::IllegalArgumentException, io::IOException )
182 : : {
183 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
184 [ # # ]: 0 : if ( !m_xSeekable.is() )
185 [ # # ]: 0 : throw io::NotConnectedException();
186 : :
187 [ # # ][ # # ]: 0 : m_xSeekable->seek( location );
[ # # ]
188 : 0 : }
189 : :
190 : 0 : ::sal_Int64 SAL_CALL SequenceInputStreamService::getPosition() throw ( uno::RuntimeException, io::IOException )
191 : : {
192 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
193 [ # # ]: 0 : if ( !m_xSeekable.is() )
194 [ # # ]: 0 : throw io::NotConnectedException();
195 : :
196 [ # # ][ # # ]: 0 : return m_xSeekable->getPosition();
[ # # ]
197 : : }
198 : :
199 : 0 : ::sal_Int64 SAL_CALL SequenceInputStreamService::getLength() throw ( uno::RuntimeException, io::IOException )
200 : : {
201 [ # # ]: 0 : ::osl::MutexGuard aGuard( m_aMutex );
202 [ # # ]: 0 : if ( !m_xSeekable.is() )
203 [ # # ]: 0 : throw io::NotConnectedException();
204 : :
205 [ # # ][ # # ]: 0 : return m_xSeekable->getLength();
[ # # ]
206 : : }
207 : :
208 : : // ::com::sun::star::lang::XInitialization:
209 : 2 : void SAL_CALL SequenceInputStreamService::initialize( const uno::Sequence< ::com::sun::star::uno::Any > & aArguments ) throw ( uno::RuntimeException, uno::Exception )
210 : : {
211 [ + - ]: 2 : ::osl::MutexGuard aGuard( m_aMutex );
212 [ - + ]: 2 : if ( m_bInitialized )
213 [ # # ]: 0 : throw frame::DoubleInitializationException();
214 : :
215 [ - + ]: 2 : if ( aArguments.getLength() != 1 )
216 : : throw lang::IllegalArgumentException( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Wrong number of arguments!\n")),
217 : : uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
218 [ # # ][ # # ]: 0 : 1 );
[ # # ]
219 : :
220 [ + - ]: 2 : uno::Sequence< sal_Int8 > aSeq;
221 [ + - ][ + - ]: 2 : if ( aArguments[0] >>= aSeq )
222 : : {
223 : : uno::Reference< io::XInputStream > xInputStream(
224 [ + - ]: 2 : static_cast< ::cppu::OWeakObject* >( new ::comphelper::SequenceInputStream( aSeq ) ),
225 [ + - ]: 4 : uno::UNO_QUERY_THROW );
226 [ + - ]: 2 : uno::Reference< io::XSeekable > xSeekable( xInputStream, uno::UNO_QUERY_THROW );
227 [ + - ]: 2 : m_xInputStream = xInputStream;
228 [ + - ]: 2 : m_xSeekable = xSeekable;
229 : 2 : m_bInitialized = sal_True;
230 : : }
231 : : else
232 : : throw lang::IllegalArgumentException( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Unexpected type of argument!\n")),
233 : : uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
234 [ # # ][ # # ]: 2 : 1 );
[ # # ][ + - ]
[ + - ]
235 : 2 : }
236 : :
237 : : } // anonymous namespace
238 : :
239 : 227 : void createRegistryInfo_SequenceInputStream()
240 : : {
241 [ + - ][ + - ]: 227 : static ::comphelper::module::OAutoRegistration< SequenceInputStreamService > aAutoRegistration;
[ + - ][ # # ]
242 : 227 : }
243 : :
244 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|