1*cdf0e10cSrcweir #include "WPXSvStream.h"
2*cdf0e10cSrcweir #include "filter/FilterInternal.hxx"
3*cdf0e10cSrcweir #include <tools/stream.hxx>
4*cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
5*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
6*cdf0e10cSrcweir #include <limits>
7*cdf0e10cSrcweir
8*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
9*cdf0e10cSrcweir using namespace ::com::sun::star::io;
10*cdf0e10cSrcweir
WPXSvInputStream(Reference<XInputStream> xStream)11*cdf0e10cSrcweir WPXSvInputStream::WPXSvInputStream( Reference< XInputStream > xStream ) :
12*cdf0e10cSrcweir WPXInputStream(true),
13*cdf0e10cSrcweir mxChildStorage(),
14*cdf0e10cSrcweir mxChildStream(),
15*cdf0e10cSrcweir mxStream(xStream),
16*cdf0e10cSrcweir mxSeekable(xStream, UNO_QUERY),
17*cdf0e10cSrcweir maData(0)
18*cdf0e10cSrcweir {
19*cdf0e10cSrcweir if (!xStream.is() || !mxStream.is())
20*cdf0e10cSrcweir mnLength = 0;
21*cdf0e10cSrcweir else
22*cdf0e10cSrcweir {
23*cdf0e10cSrcweir if (!mxSeekable.is())
24*cdf0e10cSrcweir mnLength = 0;
25*cdf0e10cSrcweir else
26*cdf0e10cSrcweir {
27*cdf0e10cSrcweir try
28*cdf0e10cSrcweir {
29*cdf0e10cSrcweir mnLength = mxSeekable->getLength();
30*cdf0e10cSrcweir }
31*cdf0e10cSrcweir catch ( ... )
32*cdf0e10cSrcweir {
33*cdf0e10cSrcweir WRITER_DEBUG_MSG(("mnLength = mxSeekable->getLength() threw exception\n"));
34*cdf0e10cSrcweir mnLength = 0;
35*cdf0e10cSrcweir }
36*cdf0e10cSrcweir }
37*cdf0e10cSrcweir }
38*cdf0e10cSrcweir }
39*cdf0e10cSrcweir
~WPXSvInputStream()40*cdf0e10cSrcweir WPXSvInputStream::~WPXSvInputStream()
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir }
43*cdf0e10cSrcweir
read(size_t numBytes,size_t & numBytesRead)44*cdf0e10cSrcweir const uint8_t * WPXSvInputStream::read(size_t numBytes, size_t &numBytesRead)
45*cdf0e10cSrcweir {
46*cdf0e10cSrcweir numBytesRead = 0;
47*cdf0e10cSrcweir
48*cdf0e10cSrcweir if (numBytes == 0 || atEOS())
49*cdf0e10cSrcweir return 0;
50*cdf0e10cSrcweir
51*cdf0e10cSrcweir numBytesRead = mxStream->readSomeBytes (maData, numBytes);
52*cdf0e10cSrcweir if (numBytesRead == 0)
53*cdf0e10cSrcweir return 0;
54*cdf0e10cSrcweir
55*cdf0e10cSrcweir return (const uint8_t *)maData.getConstArray();
56*cdf0e10cSrcweir }
57*cdf0e10cSrcweir
tell()58*cdf0e10cSrcweir long WPXSvInputStream::tell()
59*cdf0e10cSrcweir {
60*cdf0e10cSrcweir if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
61*cdf0e10cSrcweir return -1L;
62*cdf0e10cSrcweir else
63*cdf0e10cSrcweir {
64*cdf0e10cSrcweir sal_Int64 tmpPosition = mxSeekable->getPosition();
65*cdf0e10cSrcweir if ((tmpPosition < 0) || (tmpPosition > (std::numeric_limits<long>::max)()))
66*cdf0e10cSrcweir return -1L;
67*cdf0e10cSrcweir return (long)tmpPosition;
68*cdf0e10cSrcweir }
69*cdf0e10cSrcweir }
70*cdf0e10cSrcweir
seek(long offset,WPX_SEEK_TYPE seekType)71*cdf0e10cSrcweir int WPXSvInputStream::seek(long offset, WPX_SEEK_TYPE seekType)
72*cdf0e10cSrcweir {
73*cdf0e10cSrcweir if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
74*cdf0e10cSrcweir return -1;
75*cdf0e10cSrcweir
76*cdf0e10cSrcweir sal_Int64 tmpPosition = mxSeekable->getPosition();
77*cdf0e10cSrcweir if ((tmpPosition < 0) || (tmpPosition > (std::numeric_limits<long>::max)()))
78*cdf0e10cSrcweir return -1;
79*cdf0e10cSrcweir
80*cdf0e10cSrcweir sal_Int64 tmpOffset = offset;
81*cdf0e10cSrcweir if (seekType == WPX_SEEK_CUR)
82*cdf0e10cSrcweir tmpOffset += tmpPosition;
83*cdf0e10cSrcweir
84*cdf0e10cSrcweir int retVal = 0;
85*cdf0e10cSrcweir if (tmpOffset < 0)
86*cdf0e10cSrcweir {
87*cdf0e10cSrcweir tmpOffset = 0;
88*cdf0e10cSrcweir retVal = -1;
89*cdf0e10cSrcweir }
90*cdf0e10cSrcweir if (offset > mnLength)
91*cdf0e10cSrcweir {
92*cdf0e10cSrcweir tmpOffset = mnLength;
93*cdf0e10cSrcweir retVal = -1;
94*cdf0e10cSrcweir }
95*cdf0e10cSrcweir
96*cdf0e10cSrcweir try
97*cdf0e10cSrcweir {
98*cdf0e10cSrcweir mxSeekable->seek(tmpOffset);
99*cdf0e10cSrcweir return retVal;
100*cdf0e10cSrcweir }
101*cdf0e10cSrcweir catch (...)
102*cdf0e10cSrcweir {
103*cdf0e10cSrcweir WRITER_DEBUG_MSG(("mxSeekable->seek(offset) threw exception\n"));
104*cdf0e10cSrcweir return -1;
105*cdf0e10cSrcweir }
106*cdf0e10cSrcweir }
107*cdf0e10cSrcweir
atEOS()108*cdf0e10cSrcweir bool WPXSvInputStream::atEOS()
109*cdf0e10cSrcweir {
110*cdf0e10cSrcweir if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
111*cdf0e10cSrcweir return true;
112*cdf0e10cSrcweir return (mxSeekable->getPosition() >= mnLength);
113*cdf0e10cSrcweir }
114*cdf0e10cSrcweir
isOLEStream()115*cdf0e10cSrcweir bool WPXSvInputStream::isOLEStream()
116*cdf0e10cSrcweir {
117*cdf0e10cSrcweir if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
118*cdf0e10cSrcweir return false;
119*cdf0e10cSrcweir
120*cdf0e10cSrcweir sal_Int64 tmpPosition = mxSeekable->getPosition();
121*cdf0e10cSrcweir mxSeekable->seek(0);
122*cdf0e10cSrcweir
123*cdf0e10cSrcweir SvStream *pStream = utl::UcbStreamHelper::CreateStream( mxStream );
124*cdf0e10cSrcweir bool bAns = pStream && SotStorage::IsOLEStorage( pStream );
125*cdf0e10cSrcweir if (pStream)
126*cdf0e10cSrcweir delete pStream;
127*cdf0e10cSrcweir
128*cdf0e10cSrcweir mxSeekable->seek(tmpPosition);
129*cdf0e10cSrcweir
130*cdf0e10cSrcweir return bAns;
131*cdf0e10cSrcweir }
132*cdf0e10cSrcweir
getDocumentOLEStream(const char * name)133*cdf0e10cSrcweir WPXInputStream * WPXSvInputStream::getDocumentOLEStream(const char * name)
134*cdf0e10cSrcweir {
135*cdf0e10cSrcweir if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
136*cdf0e10cSrcweir return 0;
137*cdf0e10cSrcweir
138*cdf0e10cSrcweir sal_Int64 tmpPosition = mxSeekable->getPosition();
139*cdf0e10cSrcweir mxSeekable->seek(0);
140*cdf0e10cSrcweir
141*cdf0e10cSrcweir SvStream *pStream = utl::UcbStreamHelper::CreateStream( mxStream );
142*cdf0e10cSrcweir
143*cdf0e10cSrcweir if (!pStream || !SotStorage::IsOLEStorage( pStream ))
144*cdf0e10cSrcweir {
145*cdf0e10cSrcweir mxSeekable->seek(tmpPosition);
146*cdf0e10cSrcweir return 0;
147*cdf0e10cSrcweir }
148*cdf0e10cSrcweir
149*cdf0e10cSrcweir mxChildStorage = new SotStorage( pStream, sal_True );
150*cdf0e10cSrcweir
151*cdf0e10cSrcweir mxChildStream = mxChildStorage->OpenSotStream(
152*cdf0e10cSrcweir rtl::OUString::createFromAscii( name ),
153*cdf0e10cSrcweir STREAM_STD_READ );
154*cdf0e10cSrcweir
155*cdf0e10cSrcweir mxSeekable->seek(tmpPosition);
156*cdf0e10cSrcweir
157*cdf0e10cSrcweir if ( !mxChildStream.Is() || mxChildStream->GetError() )
158*cdf0e10cSrcweir {
159*cdf0e10cSrcweir mxSeekable->seek(tmpPosition);
160*cdf0e10cSrcweir return 0;
161*cdf0e10cSrcweir }
162*cdf0e10cSrcweir
163*cdf0e10cSrcweir Reference < XInputStream > xContents(new utl::OSeekableInputStreamWrapper( mxChildStream ));
164*cdf0e10cSrcweir mxSeekable->seek(tmpPosition);
165*cdf0e10cSrcweir if (xContents.is())
166*cdf0e10cSrcweir return new WPXSvInputStream( xContents );
167*cdf0e10cSrcweir else
168*cdf0e10cSrcweir return 0;
169*cdf0e10cSrcweir }
170*cdf0e10cSrcweir
getDocumentOLEStream()171*cdf0e10cSrcweir WPXInputStream * WPXSvInputStream::getDocumentOLEStream()
172*cdf0e10cSrcweir {
173*cdf0e10cSrcweir return getDocumentOLEStream( "PerfectOffice_MAIN" );
174*cdf0e10cSrcweir }
175