summaryrefslogtreecommitdiff
path: root/xmlhelp
diff options
context:
space:
mode:
authorAndreas Bille <abi@openoffice.org>2002-03-28 11:38:08 +0000
committerAndreas Bille <abi@openoffice.org>2002-03-28 11:38:08 +0000
commit1d958817acfd51dddeefa151ab5103b85a590281 (patch)
tree2cd257c88f799d4e21dd4448e54f110d343c3de7 /xmlhelp
parent0a36b9287310228b88c254f20a7849efb026c897 (diff)
#98119# Work around for utl-bug
Diffstat (limited to 'xmlhelp')
-rw-r--r--xmlhelp/source/cxxhelp/provider/bufferedinputstream.cxx207
-rw-r--r--xmlhelp/source/cxxhelp/provider/urlparameter.cxx14
2 files changed, 219 insertions, 2 deletions
diff --git a/xmlhelp/source/cxxhelp/provider/bufferedinputstream.cxx b/xmlhelp/source/cxxhelp/provider/bufferedinputstream.cxx
new file mode 100644
index 000000000000..9adc662def4e
--- /dev/null
+++ b/xmlhelp/source/cxxhelp/provider/bufferedinputstream.cxx
@@ -0,0 +1,207 @@
+#ifndef _RTL_MEMORY_H_
+#include <rtl/memory.h>
+#endif
+#ifndef _BUFFEREDINPUTSTREAM_HXX_
+#include <provider/bufferedinputstream.hxx>
+#endif
+
+
+using namespace cppu;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::io;
+using namespace chelp;
+
+
+Reference<XInputStream> chelp::turnToSeekable(const Reference<XInputStream>& xInputStream)
+{
+ if( ! xInputStream.is() )
+ return xInputStream;
+
+ Reference<XSeekable> xSeekable(xInputStream,UNO_QUERY);
+
+ if( xSeekable.is() )
+ return xInputStream;
+
+ return new BufferedInputStream(xInputStream);
+}
+
+
+
+BufferedInputStream::BufferedInputStream(const Reference<XInputStream>& xInputStream)
+ : m_nBufferLocation(0),
+ m_nBufferSize(0),
+ m_pBuffer(new sal_Int8[0])
+{
+ try
+ {
+ sal_Int32 num;
+ sal_Int8 *tmp;
+ Sequence< sal_Int8 > aData(4096);
+ do{
+ num = xInputStream->readBytes(aData,4096);
+ if( num > 0 )
+ {
+ tmp = m_pBuffer;
+ m_pBuffer = new sal_Int8[m_nBufferSize+num];
+ rtl_copyMemory((void *)(m_pBuffer),
+ (void *)(tmp),
+ sal_uInt32(m_nBufferSize));
+ rtl_copyMemory((void *)(m_pBuffer+m_nBufferSize),
+ (void *)(aData.getArray()),
+ sal_uInt32(num));
+ m_nBufferSize += num;
+ delete[] tmp;
+ }
+ } while( num == 4096 );
+ }
+ catch( const NotConnectedException&)
+ {
+ }
+ catch( const BufferSizeExceededException&)
+ {
+ }
+ catch( const IOException&)
+ {
+ }
+ catch( const RuntimeException&)
+ {
+ }
+ xInputStream->closeInput();
+}
+
+
+BufferedInputStream::~BufferedInputStream()
+{
+ delete[] m_pBuffer;
+}
+
+
+Any SAL_CALL BufferedInputStream::queryInterface( const Type& rType ) throw( RuntimeException )
+{
+ Any aRet = ::cppu::queryInterface( rType,
+ SAL_STATIC_CAST( XInputStream*,this ),
+ SAL_STATIC_CAST( XSeekable*,this ) );
+
+ return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
+}
+
+
+void SAL_CALL BufferedInputStream::acquire( void ) throw()
+{
+ OWeakObject::acquire();
+}
+
+
+void SAL_CALL BufferedInputStream::release( void ) throw()
+{
+ OWeakObject::release();
+}
+
+
+
+sal_Int32 SAL_CALL BufferedInputStream::readBytes( Sequence< sal_Int8 >& aData,sal_Int32 nBytesToRead )
+ throw( NotConnectedException,
+ BufferSizeExceededException,
+ IOException,
+ RuntimeException)
+{
+ osl::MutexGuard aGuard( m_aMutex );
+
+ if( 0 > nBytesToRead )
+ throw BufferSizeExceededException();
+
+ if( m_nBufferLocation + nBytesToRead > m_nBufferSize )
+ nBytesToRead = m_nBufferSize - m_nBufferLocation;
+
+ if( aData.getLength() < nBytesToRead )
+ aData.realloc(nBytesToRead);
+
+ rtl_copyMemory((void*)(aData.getArray()),
+ (void*)(m_pBuffer+m_nBufferLocation),
+ nBytesToRead);
+
+ return nBytesToRead;
+}
+
+
+sal_Int32 SAL_CALL BufferedInputStream::readSomeBytes(
+ Sequence< sal_Int8 >& aData,sal_Int32 nMaxBytesToRead )
+ throw( NotConnectedException,
+ BufferSizeExceededException,
+ IOException,
+ RuntimeException)
+{
+ return readBytes(aData,nMaxBytesToRead);
+}
+
+
+
+void SAL_CALL BufferedInputStream::skipBytes( sal_Int32 nBytesToSkip )
+ throw( NotConnectedException,
+ BufferSizeExceededException,
+ IOException,
+ RuntimeException )
+{
+ try
+ {
+ seek(m_nBufferLocation+nBytesToSkip);
+ }
+ catch( const IllegalArgumentException& )
+ {
+ throw BufferSizeExceededException();
+ }
+}
+
+
+
+sal_Int32 SAL_CALL BufferedInputStream::available( void )
+ throw( NotConnectedException,
+ IOException,
+ RuntimeException )
+{
+ osl::MutexGuard aGuard( m_aMutex );
+ return m_nBufferSize-m_nBufferLocation;
+}
+
+
+
+void SAL_CALL BufferedInputStream::closeInput( void )
+ throw( NotConnectedException,
+ IOException,
+ RuntimeException )
+{
+}
+
+
+void SAL_CALL BufferedInputStream::seek( sal_Int64 location )
+ throw( IllegalArgumentException,
+ IOException,
+ RuntimeException )
+{
+ if( 0 <= location && location < m_nBufferSize )
+ {
+ osl::MutexGuard aGuard( m_aMutex );
+ m_nBufferLocation = location;
+ }
+ else
+ throw IllegalArgumentException();
+}
+
+
+
+sal_Int64 SAL_CALL BufferedInputStream::getPosition( void )
+ throw( IOException,
+ RuntimeException )
+{
+ osl::MutexGuard aGuard( m_aMutex );
+ return m_nBufferLocation;
+}
+
+
+
+sal_Int64 SAL_CALL BufferedInputStream::getLength( void ) throw( IOException,RuntimeException )
+{
+ osl::MutexGuard aGuard( m_aMutex );
+ return m_nBufferSize;
+}
diff --git a/xmlhelp/source/cxxhelp/provider/urlparameter.cxx b/xmlhelp/source/cxxhelp/provider/urlparameter.cxx
index 0c9ee686e438..51caf42cd3f9 100644
--- a/xmlhelp/source/cxxhelp/provider/urlparameter.cxx
+++ b/xmlhelp/source/cxxhelp/provider/urlparameter.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: urlparameter.cxx,v $
*
- * $Revision: 1.26 $
+ * $Revision: 1.27 $
*
- * last change: $Author: abi $ $Date: 2002-03-07 11:55:55 $
+ * last change: $Author: abi $ $Date: 2002-03-28 12:38:08 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -59,6 +59,12 @@
*
************************************************************************/
+#define WORKAROUND_98119
+
+#ifdef WORKAROUND_98119
+#include <provider/bufferedinputstream.hxx>
+#endif
+
#include <string.h>
#ifndef _VOS_DIAGNOSE_HXX_
#include <vos/diagnose.hxx>
@@ -537,7 +543,11 @@ void URLParameter::open( const Reference< XMultiServiceFactory >& rxSMgr,
{
}
}
+#ifdef WORKAROUND_98119
+ xDataSink->setInputStream( turnToSeekable(xStream) );
+#else
xDataSink->setInputStream( xStream );
+#endif
}
else
// a standard document or else an active help text, plug in the new input stream