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