summaryrefslogtreecommitdiff
path: root/writerperfect/source/stream
diff options
context:
space:
mode:
Diffstat (limited to 'writerperfect/source/stream')
-rw-r--r--writerperfect/source/stream/WPXSvStream.cxx174
-rw-r--r--writerperfect/source/stream/WPXSvStream.h47
-rw-r--r--writerperfect/source/stream/makefile.mk18
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