diff options
Diffstat (limited to 'writerperfect/source/stream')
-rw-r--r-- | writerperfect/source/stream/WPXSvStream.cxx | 174 | ||||
-rw-r--r-- | writerperfect/source/stream/WPXSvStream.h | 47 | ||||
-rw-r--r-- | writerperfect/source/stream/makefile.mk | 18 |
3 files changed, 239 insertions, 0 deletions
diff --git a/writerperfect/source/stream/WPXSvStream.cxx b/writerperfect/source/stream/WPXSvStream.cxx new file mode 100644 index 000000000000..973fb5ab31d9 --- /dev/null +++ b/writerperfect/source/stream/WPXSvStream.cxx @@ -0,0 +1,174 @@ +#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, 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" ); +} diff --git a/writerperfect/source/stream/WPXSvStream.h b/writerperfect/source/stream/WPXSvStream.h new file mode 100644 index 000000000000..099c5a76eccf --- /dev/null +++ b/writerperfect/source/stream/WPXSvStream.h @@ -0,0 +1,47 @@ +#ifndef WPXSVSTREAM_H +#define WPXSVSTREAM_H + +#include <sot/storage.hxx> +#include <com/sun/star/io/XInputStream.hpp> + +#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_H_ +#include <com/sun/star/io/XSeekable.hpp> +#endif + + +#if defined _MSC_VER +#pragma warning( push, 1 ) +#endif +#include <libwpd/WPXStream.h> +#if defined _MSC_VER +#pragma warning( pop ) +#endif + +class WPXSvInputStream : public WPXInputStream +{ +public: + WPXSvInputStream( ::com::sun::star::uno::Reference< + ::com::sun::star::io::XInputStream > xStream ); + virtual ~WPXSvInputStream(); + + virtual bool isOLEStream(); + virtual WPXInputStream * getDocumentOLEStream(); + virtual WPXInputStream * getDocumentOLEStream(const char *name); + + virtual const uint8_t *read(size_t numBytes, size_t &numBytesRead); + virtual int seek(long offset, WPX_SEEK_TYPE seekType); + virtual long tell(); + virtual bool atEOS(); + +private: + SotStorageRef mxChildStorage; + SotStorageStreamRef mxChildStream; + ::com::sun::star::uno::Reference< + ::com::sun::star::io::XInputStream > mxStream; + ::com::sun::star::uno::Reference< + ::com::sun::star::io::XSeekable > mxSeekable; + ::com::sun::star::uno::Sequence< sal_Int8 > maData; + sal_Int64 mnLength; +}; + +#endif diff --git a/writerperfect/source/stream/makefile.mk b/writerperfect/source/stream/makefile.mk new file mode 100644 index 000000000000..7e684b71bdb1 --- /dev/null +++ b/writerperfect/source/stream/makefile.mk @@ -0,0 +1,18 @@ +PRJ=..$/.. + +PRJNAME=writerperfect +TARGET=stream +ENABLE_EXCEPTIONS=true + +.INCLUDE : settings.mk + +.IF "$(SYSTEM_LIBWPD)" == "YES" +INCPRE+=$(LIBWPD_CFLAGS) +.ENDIF + +# broken but ... necessary, internal include shafted ... +INCPRE+= -I.. + +SLOFILES= $(SLO)$/WPXSvStream.obj + +.INCLUDE : target.mk |