1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_package.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
27*b1cdbd2cSJim Jagielski #include <cppuhelper/typeprovider.hxx>
28*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim Jagielski #include "oseekinstream.hxx"
31*b1cdbd2cSJim Jagielski #include "owriteablestream.hxx"
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
34*b1cdbd2cSJim Jagielski
OInputSeekStream(OWriteStream_Impl & pImpl,uno::Reference<io::XInputStream> xStream,const uno::Sequence<beans::PropertyValue> & aProps,sal_Int32 nStorageType)35*b1cdbd2cSJim Jagielski OInputSeekStream::OInputSeekStream( OWriteStream_Impl& pImpl,
36*b1cdbd2cSJim Jagielski uno::Reference < io::XInputStream > xStream,
37*b1cdbd2cSJim Jagielski const uno::Sequence< beans::PropertyValue >& aProps,
38*b1cdbd2cSJim Jagielski sal_Int32 nStorageType )
39*b1cdbd2cSJim Jagielski : OInputCompStream( pImpl, xStream, aProps, nStorageType )
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski if ( m_xStream.is() )
42*b1cdbd2cSJim Jagielski {
43*b1cdbd2cSJim Jagielski m_xSeekable = uno::Reference< io::XSeekable >( m_xStream, uno::UNO_QUERY );
44*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xSeekable.is(), "No seeking support!\n" );
45*b1cdbd2cSJim Jagielski }
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski
OInputSeekStream(uno::Reference<io::XInputStream> xStream,const uno::Sequence<beans::PropertyValue> & aProps,sal_Int32 nStorageType)48*b1cdbd2cSJim Jagielski OInputSeekStream::OInputSeekStream( uno::Reference < io::XInputStream > xStream,
49*b1cdbd2cSJim Jagielski const uno::Sequence< beans::PropertyValue >& aProps,
50*b1cdbd2cSJim Jagielski sal_Int32 nStorageType )
51*b1cdbd2cSJim Jagielski : OInputCompStream( xStream, aProps, nStorageType )
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski if ( m_xStream.is() )
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski m_xSeekable = uno::Reference< io::XSeekable >( m_xStream, uno::UNO_QUERY );
56*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xSeekable.is(), "No seeking support!\n" );
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski
~OInputSeekStream()60*b1cdbd2cSJim Jagielski OInputSeekStream::~OInputSeekStream()
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski
getTypes()64*b1cdbd2cSJim Jagielski uno::Sequence< uno::Type > SAL_CALL OInputSeekStream::getTypes()
65*b1cdbd2cSJim Jagielski throw ( uno::RuntimeException )
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski static ::cppu::OTypeCollection* pTypeCollection = NULL ;
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski if ( pTypeCollection == NULL )
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() ) ;
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski if ( pTypeCollection == NULL )
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski static ::cppu::OTypeCollection aTypeCollection(
76*b1cdbd2cSJim Jagielski ::getCppuType(( const uno::Reference< io::XSeekable >* )NULL ),
77*b1cdbd2cSJim Jagielski OInputCompStream::getTypes() );
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski pTypeCollection = &aTypeCollection ;
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski return pTypeCollection->getTypes() ;
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski
queryInterface(const uno::Type & rType)86*b1cdbd2cSJim Jagielski uno::Any SAL_CALL OInputSeekStream::queryInterface( const uno::Type& rType )
87*b1cdbd2cSJim Jagielski throw( uno::RuntimeException )
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski // Attention:
90*b1cdbd2cSJim Jagielski // Don't use mutex or guard in this method!!! Is a method of XInterface.
91*b1cdbd2cSJim Jagielski
92*b1cdbd2cSJim Jagielski uno::Any aReturn( ::cppu::queryInterface( rType,
93*b1cdbd2cSJim Jagielski static_cast< io::XSeekable* >( this ) ) );
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski if ( aReturn.hasValue() == sal_True )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski return aReturn ;
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski return OInputCompStream::queryInterface( rType ) ;
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski
acquire()103*b1cdbd2cSJim Jagielski void SAL_CALL OInputSeekStream::acquire()
104*b1cdbd2cSJim Jagielski throw()
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski OInputCompStream::acquire();
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski
release()109*b1cdbd2cSJim Jagielski void SAL_CALL OInputSeekStream::release()
110*b1cdbd2cSJim Jagielski throw()
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski OInputCompStream::release();
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski
seek(sal_Int64 location)116*b1cdbd2cSJim Jagielski void SAL_CALL OInputSeekStream::seek( sal_Int64 location )
117*b1cdbd2cSJim Jagielski throw ( lang::IllegalArgumentException,
118*b1cdbd2cSJim Jagielski io::IOException,
119*b1cdbd2cSJim Jagielski uno::RuntimeException )
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
122*b1cdbd2cSJim Jagielski if ( m_bDisposed )
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
125*b1cdbd2cSJim Jagielski throw lang::DisposedException();
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski if ( !m_xSeekable.is() )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No seekable!" ) ) );
131*b1cdbd2cSJim Jagielski throw uno::RuntimeException();
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski m_xSeekable->seek( location );
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski
getPosition()137*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL OInputSeekStream::getPosition()
138*b1cdbd2cSJim Jagielski throw ( io::IOException,
139*b1cdbd2cSJim Jagielski uno::RuntimeException)
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
142*b1cdbd2cSJim Jagielski if ( m_bDisposed )
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
145*b1cdbd2cSJim Jagielski throw lang::DisposedException();
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski if ( !m_xSeekable.is() )
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No seekable!" ) ) );
151*b1cdbd2cSJim Jagielski throw uno::RuntimeException();
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielski return m_xSeekable->getPosition();
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski
getLength()157*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL OInputSeekStream::getLength()
158*b1cdbd2cSJim Jagielski throw ( io::IOException,
159*b1cdbd2cSJim Jagielski uno::RuntimeException )
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
162*b1cdbd2cSJim Jagielski if ( m_bDisposed )
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
165*b1cdbd2cSJim Jagielski throw lang::DisposedException();
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski
168*b1cdbd2cSJim Jagielski if ( !m_xSeekable.is() )
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No seekable!" ) ) );
171*b1cdbd2cSJim Jagielski throw uno::RuntimeException();
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski return m_xSeekable->getLength();
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski
177