blob: 532a3dc143812e2325fadf4fa4a0b45637c240d2 [file] [log] [blame]
#include "WPXSvStream.h"
#include "filter/FilterInternal.hxx"
#include <tools/stream.hxx>
#include <unotools/streamwrap.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <limits>
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::io;
WPXSvInputStream::WPXSvInputStream( Reference< XInputStream > xStream ) :
WPXInputStream(true),
mxChildStorage(),
mxChildStream(),
mxStream(xStream),
mxSeekable(xStream, UNO_QUERY),
maData(0)
{
if (!xStream.is() || !mxStream.is())
mnLength = 0;
else
{
if (!mxSeekable.is())
mnLength = 0;
else
{
try
{
mnLength = mxSeekable->getLength();
}
catch ( ... )
{
WRITER_DEBUG_MSG(("mnLength = mxSeekable->getLength() threw exception\n"));
mnLength = 0;
}
}
}
}
WPXSvInputStream::~WPXSvInputStream()
{
}
const uint8_t * WPXSvInputStream::read(size_t numBytes, size_t &numBytesRead)
{
numBytesRead = 0;
if (numBytes == 0 || atEOS())
return 0;
numBytesRead = mxStream->readSomeBytes (maData, numBytes);
if (numBytesRead == 0)
return 0;
return (const uint8_t *)maData.getConstArray();
}
long WPXSvInputStream::tell()
{
if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
return -1L;
else
{
sal_Int64 tmpPosition = mxSeekable->getPosition();
if ((tmpPosition < 0) || (tmpPosition > (std::numeric_limits<long>::max)()))
return -1L;
return (long)tmpPosition;
}
}
int WPXSvInputStream::seek(long offset, WPX_SEEK_TYPE seekType)
{
if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
return -1;
sal_Int64 tmpPosition = mxSeekable->getPosition();
if ((tmpPosition < 0) || (tmpPosition > (std::numeric_limits<long>::max)()))
return -1;
sal_Int64 tmpOffset = offset;
if (seekType == WPX_SEEK_CUR)
tmpOffset += tmpPosition;
int retVal = 0;
if (tmpOffset < 0)
{
tmpOffset = 0;
retVal = -1;
}
if (offset > mnLength)
{
tmpOffset = mnLength;
retVal = -1;
}
try
{
mxSeekable->seek(tmpOffset);
return retVal;
}
catch (...)
{
WRITER_DEBUG_MSG(("mxSeekable->seek(offset) threw exception\n"));
return -1;
}
}
bool WPXSvInputStream::atEOS()
{
if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
return true;
return (mxSeekable->getPosition() >= mnLength);
}
bool WPXSvInputStream::isOLEStream()
{
if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
return false;
sal_Int64 tmpPosition = mxSeekable->getPosition();
mxSeekable->seek(0);
SvStream *pStream = utl::UcbStreamHelper::CreateStream( mxStream );
bool bAns = pStream && SotStorage::IsOLEStorage( pStream );
if (pStream)
delete pStream;
mxSeekable->seek(tmpPosition);
return bAns;
}
WPXInputStream * WPXSvInputStream::getDocumentOLEStream(const char * name)
{
if ((mnLength == 0) || !mxStream.is() || !mxSeekable.is())
return 0;
sal_Int64 tmpPosition = mxSeekable->getPosition();
mxSeekable->seek(0);
SvStream *pStream = utl::UcbStreamHelper::CreateStream( mxStream );
if (!pStream || !SotStorage::IsOLEStorage( pStream ))
{
mxSeekable->seek(tmpPosition);
return 0;
}
mxChildStorage = new SotStorage( pStream, sal_True );
mxChildStream = mxChildStorage->OpenSotStream(
rtl::OUString::createFromAscii( name ),
STREAM_STD_READ );
mxSeekable->seek(tmpPosition);
if ( !mxChildStream.Is() || mxChildStream->GetError() )
{
mxSeekable->seek(tmpPosition);
return 0;
}
Reference < XInputStream > xContents(new utl::OSeekableInputStreamWrapper( mxChildStream ));
mxSeekable->seek(tmpPosition);
if (xContents.is())
return new WPXSvInputStream( xContents );
else
return 0;
}
WPXInputStream * WPXSvInputStream::getDocumentOLEStream()
{
return getDocumentOLEStream( "PerfectOffice_MAIN" );
}