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