xref: /AOO41X/main/unotools/inc/unotools/streamwrap.hxx (revision bae3752ec30c258ca902793e4eea3c818b0bcaad)
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 #include "unotools/unotoolsdllapi.h"
24 
25 #ifndef _UTL_STREAM_WRAPPER_HXX_
26 #define _UTL_STREAM_WRAPPER_HXX_
27 #include <osl/mutex.hxx>
28 #include <com/sun/star/io/XOutputStream.hpp>
29 #include <com/sun/star/io/XInputStream.hpp>
30 #include <com/sun/star/io/XSeekable.hpp>
31 #include <com/sun/star/io/XTruncate.hpp>
32 #include <com/sun/star/io/XStream.hpp>
33 #include <cppuhelper/implbase3.hxx>
34 #include <cppuhelper/implbase1.hxx>
35 
36 class SvStream;
37 
38 namespace utl
39 {
40     namespace stario    = ::com::sun::star::io;
41     namespace staruno   = ::com::sun::star::uno;
42 
43 //==================================================================
44 //= OInputStreamWrapper
45 //==================================================================
46 typedef ::cppu::WeakImplHelper1 <   stario::XInputStream
47                                 > InputStreamWrapper_Base;
48     // needed for some compilers
49 /// helper class for wrapping an SvStream into an <type scope="com.sun.star.io">XInputStream</type>
50 class UNOTOOLS_DLLPUBLIC OInputStreamWrapper : public InputStreamWrapper_Base
51 {
52 protected:
53     ::osl::Mutex    m_aMutex;
54     SvStream*       m_pSvStream;
55     sal_Bool        m_bSvStreamOwner : 1;
OInputStreamWrapper()56     OInputStreamWrapper()
57                     { m_pSvStream = 0; m_bSvStreamOwner = sal_False; }
SetStream(SvStream * _pStream,sal_Bool bOwner)58     void            SetStream(SvStream* _pStream, sal_Bool bOwner )
59                     { m_pSvStream = _pStream; m_bSvStreamOwner = bOwner; }
60 
61 public:
62     OInputStreamWrapper(SvStream& _rStream);
63     OInputStreamWrapper(SvStream* pStream, sal_Bool bOwner=sal_False);
64     virtual ~OInputStreamWrapper();
65 
66 // stario::XInputStream
67     virtual sal_Int32   SAL_CALL    readBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
68     virtual sal_Int32   SAL_CALL    readSomeBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
69     virtual void        SAL_CALL    skipBytes(sal_Int32 nBytesToSkip) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
70     virtual sal_Int32   SAL_CALL    available() throw(stario::NotConnectedException, staruno::RuntimeException);
71     virtual void        SAL_CALL    closeInput() throw(stario::NotConnectedException, staruno::RuntimeException);
72 
73 protected:
74     /// throws a NotConnectedException if the object is not connected anymore
75     void checkConnected() const;
76     /// throws an exception according to the error flag of m_pSvStream
77     void checkError() const;
78 };
79 
80 //==================================================================
81 //= OSeekableInputStreamWrapper
82 //==================================================================
83 typedef ::cppu::ImplHelper1 <   ::com::sun::star::io::XSeekable
84                             >   OSeekableInputStreamWrapper_Base;
85 /** helper class for wrapping an SvStream into an <type scope="com.sun.star.io">XInputStream</type>
86     which is seekable (i.e. supports the <type scope="com.sun.star.io">XSeekable</type> interface).
87 */
88 class UNOTOOLS_DLLPUBLIC OSeekableInputStreamWrapper : public ::cppu::ImplInheritanceHelper1 < OInputStreamWrapper, com::sun::star::io::XSeekable >
89 {
90 protected:
OSeekableInputStreamWrapper()91     OSeekableInputStreamWrapper() {}
92 public:
93     OSeekableInputStreamWrapper(SvStream& _rStream);
94     OSeekableInputStreamWrapper(SvStream* _pStream, sal_Bool _bOwner = sal_False);
95 
96     // XSeekable
97     virtual void SAL_CALL seek( sal_Int64 _nLocation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
98     virtual sal_Int64 SAL_CALL getPosition(  ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
99     virtual sal_Int64 SAL_CALL getLength(  ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
100 };
101 
102 //==================================================================
103 //= OOutputStreamWrapper
104 //==================================================================
105 typedef ::cppu::WeakImplHelper1<stario::XOutputStream> OutputStreamWrapper_Base;
106     // needed for some compilers
107 class UNOTOOLS_DLLPUBLIC OOutputStreamWrapper : public OutputStreamWrapper_Base
108 {
109 protected:
110     // TODO: thread safety!
111     SvStream&       rStream;
112 
113 public:
OOutputStreamWrapper(SvStream & _rStream)114     OOutputStreamWrapper(SvStream& _rStream) :rStream(_rStream) { }
115 
116 // stario::XOutputStream
117     virtual void SAL_CALL writeBytes(const staruno::Sequence< sal_Int8 >& aData) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
118     virtual void SAL_CALL flush() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
119     virtual void SAL_CALL closeOutput() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
120 
121 protected:
122     /// throws an exception according to the error flag of m_pSvStream
123     void checkError() const;
124 };
125 
126 //==================================================================
127 //= OSeekableOutputStreamWrapper
128 //==================================================================
129 typedef ::cppu::ImplHelper1 <   ::com::sun::star::io::XSeekable
130                             >   OSeekableOutputStreamWrapper_Base;
131 /** helper class for wrapping an SvStream into an <type scope="com.sun.star.io">XOutputStream</type>
132     which is seekable (i.e. supports the <type scope="com.sun.star.io">XSeekable</type> interface).
133 */
134 class UNOTOOLS_DLLPUBLIC OSeekableOutputStreamWrapper
135                 :public OOutputStreamWrapper
136                 ,public OSeekableOutputStreamWrapper_Base
137 {
138 public:
139     OSeekableOutputStreamWrapper(SvStream& _rStream);
140 
141     // disambiguate XInterface
142     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException);
143     virtual void SAL_CALL acquire(  ) throw ();
144     virtual void SAL_CALL release(  ) throw ();
145 
146     // XSeekable
147     virtual void SAL_CALL seek( sal_Int64 _nLocation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
148     virtual sal_Int64 SAL_CALL getPosition(  ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
149     virtual sal_Int64 SAL_CALL getLength(  ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
150 };
151 
152 class UNOTOOLS_DLLPUBLIC OStreamWrapper : public ::cppu::ImplInheritanceHelper3 < OSeekableInputStreamWrapper, com::sun::star::io::XStream, com::sun::star::io::XOutputStream, com::sun::star::io::XTruncate >
153 {
154 public:
155     OStreamWrapper(SvStream& _rStream);
156 
157 // stario::XStream
158     virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getInputStream(  ) throw (::com::sun::star::uno::RuntimeException);
159     virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > SAL_CALL getOutputStream(  ) throw (::com::sun::star::uno::RuntimeException);
160 
161 // stario::XOutputStream
162     virtual void SAL_CALL writeBytes(const staruno::Sequence< sal_Int8 >& aData) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
163     virtual void SAL_CALL flush() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
164     virtual void SAL_CALL closeOutput() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException);
165     virtual void SAL_CALL truncate() throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
166 };
167 
168 }
169 // namespace utl
170 
171 #endif // _UTL_STREAM_WRAPPER_HXX_
172 
173