Commits

Anonymous committed 604b98f

initial import

  • Participants
  • Parent commits add02d2

Comments (0)

Files changed (68)

File io/prj/d.lst

+..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\*
+..\%__SRC%\bin\*.rdb %_DEST%\rdb%_EXT%\*
+..\source\acceptor\acceptor.xml %_DEST%\xml%_EXT%\acceptor.xml
+..\source\connector\connectr.xml %_DEST%\xml%_EXT%\connectr.xml
+..\source\stm\stm.xml %_DEST%\xml%_EXT%\stm.xml
+..\%__SRC%\lib\*.so %_DEST%\lib%_EXT%\*

File io/source/TextInputStream/TextInputStream.cxx

+/*************************************************************************
+ *
+ *  $RCSfile: TextInputStream.cxx,v $
+ *
+ *  $Revision: 1.1.1.1 $
+ *
+ *  last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+ *
+ *  The Contents of this file are made available subject to the terms of
+ *  either of the following licenses
+ *
+ *         - GNU Lesser General Public License Version 2.1
+ *         - Sun Industry Standards Source License Version 1.1
+ *
+ *  Sun Microsystems Inc., October, 2000
+ *
+ *  GNU Lesser General Public License Version 2.1
+ *  =============================================
+ *  Copyright 2000 by Sun Microsystems, Inc.
+ *  901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1, as published by the Free Software Foundation.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *  MA  02111-1307  USA
+ *
+ *
+ *  Sun Industry Standards Source License Version 1.1
+ *  =================================================
+ *  The contents of this file are subject to the Sun Industry Standards
+ *  Source License Version 1.1 (the "License"); You may not use this file
+ *  except in compliance with the License. You may obtain a copy of the
+ *  License at http://www.openoffice.org/license.html.
+ *
+ *  Software provided under this License is provided on an "AS IS" basis,
+ *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ *  See the License for the specific provisions governing your rights and
+ *  obligations concerning the Software.
+ *
+ *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ *  Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ *  All Rights Reserved.
+ *
+ *  Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+
+#include <string.h>
+#include <osl/mutex.hxx>
+#include <osl/diagnose.h>
+
+#include <uno/mapping.hxx>
+
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase2.hxx>
+
+#include <rtl/textenc.h>
+#include <rtl/tencinfo.h>
+
+#include <com/sun/star/io/XTextInputStream.hpp>
+#include <com/sun/star/io/XActiveDataSink.hpp>
+
+
+#define IMPLEMENTATION_NAME "com.sun.star.comp.io.TextInputStream"
+#define SERVICE_NAME "com.sun.star.io.TextInputStream"
+
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::cppu;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::registry;
+
+
+namespace io_TextStream
+{
+
+//===========================================================================
+// Implementation XTextInputStream
+
+typedef WeakImplHelper2< XTextInputStream, XActiveDataSink > TextInputStreamHelper;
+class OCommandEnvironment;
+
+#define INITIAL_UNICODE_BUFFER_CAPACITY		0x100
+#define READ_BYTE_COUNT						0x100
+
+class OTextInputStream : public TextInputStreamHelper
+{
+	Reference< XInputStream > mxStream;
+
+	// Encoding
+	OUString mEncoding;
+	sal_Bool mbEncodingInitialized;
+	rtl_TextToUnicodeConverter 	mConvText2Unicode;
+	rtl_TextToUnicodeContext   	mContextText2Unicode;
+	Sequence<sal_Int8>			mSeqSource;
+
+	// Internal buffer for characters that are already converted successfully
+	sal_Unicode* mpBuffer;
+	sal_Int32 mnBufferSize;
+	sal_Int32 mnCharsInBuffer;
+	sal_Bool mbReachedEOF;
+
+	void implResizeBuffer( void );
+	OUString implReadString( const Sequence< sal_Unicode >& Delimiters, 
+		sal_Bool bRemoveDelimiter, sal_Bool bFindLineEnd ) 
+			throw(IOException, RuntimeException);
+	sal_Int32 implReadNext() throw(IOException, RuntimeException);
+	
+public:
+	OTextInputStream();
+	virtual ~OTextInputStream();
+
+    // Methods XTextInputStream
+    virtual OUString SAL_CALL readLine(  ) 
+		throw(IOException, RuntimeException);
+    virtual OUString SAL_CALL readString( const Sequence< sal_Unicode >& Delimiters, sal_Bool bRemoveDelimiter ) 
+		throw(IOException, RuntimeException);
+    virtual sal_Bool SAL_CALL isEOF(  ) 
+		throw(IOException, RuntimeException);
+    virtual void SAL_CALL setEncoding( const OUString& Encoding ) throw(RuntimeException);
+
+    // Methods XInputStream
+    virtual sal_Int32 SAL_CALL readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+    virtual sal_Int32 SAL_CALL readSomeBytes( Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+    virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+    virtual sal_Int32 SAL_CALL available(  ) 
+		throw(NotConnectedException, IOException, RuntimeException);
+    virtual void SAL_CALL closeInput(  ) 
+		throw(NotConnectedException, IOException, RuntimeException);
+
+    // Methods XActiveDataSink
+    virtual void SAL_CALL setInputStream( const Reference< XInputStream >& aStream ) 
+		throw(RuntimeException);
+    virtual Reference< XInputStream > SAL_CALL getInputStream() 
+		throw(RuntimeException);
+};
+
+OTextInputStream::OTextInputStream()
+	: mpBuffer( NULL ), mnBufferSize( 0 ), mnCharsInBuffer( 0 ), mbReachedEOF( sal_False )
+{
+	mbEncodingInitialized = false;
+}
+
+OTextInputStream::~OTextInputStream()
+{
+	if( mbEncodingInitialized )
+	{
+		rtl_destroyUnicodeToTextContext( mConvText2Unicode, mContextText2Unicode );
+		rtl_destroyUnicodeToTextConverter( mConvText2Unicode );
+	}
+}
+
+void OTextInputStream::implResizeBuffer( void )
+{
+	sal_Int32 mnNewBufferSize = mnBufferSize * 2;
+	sal_Unicode* pNewBuffer = new sal_Unicode[ mnNewBufferSize ];
+	memcpy( pNewBuffer, mpBuffer, mnCharsInBuffer * sizeof( sal_Unicode ) );
+	mpBuffer = pNewBuffer;
+	mnBufferSize = mnNewBufferSize;
+}
+
+
+//===========================================================================
+// XTextInputStream
+
+OUString OTextInputStream::readLine(  ) 
+	throw(IOException, RuntimeException)
+{
+	static Sequence< sal_Unicode > aDummySeq;
+	return implReadString( aDummySeq, sal_True, sal_True );
+}
+
+OUString OTextInputStream::readString( const Sequence< sal_Unicode >& Delimiters, sal_Bool bRemoveDelimiter ) 
+		throw(IOException, RuntimeException)
+{
+	return implReadString( Delimiters, sal_True, sal_False );
+}
+
+sal_Bool OTextInputStream::isEOF() 
+	throw(IOException, RuntimeException)
+{
+	sal_Bool bRet = sal_False;
+	if( mnCharsInBuffer == 0 && mbReachedEOF )
+		bRet = sal_True;
+	return bRet;
+}
+
+
+OUString OTextInputStream::implReadString( const Sequence< sal_Unicode >& Delimiters, 
+										   sal_Bool bRemoveDelimiter, sal_Bool bFindLineEnd ) 
+		throw(IOException, RuntimeException)
+{
+	OUString aRetStr;
+	if( !mbEncodingInitialized )
+	{
+		OUString aUtf8Str( RTL_CONSTASCII_USTRINGPARAM("utf8") );
+		setEncoding( aUtf8Str );
+	}
+	if( !mbEncodingInitialized )
+		return aRetStr;
+
+	if( !mpBuffer )
+	{
+		mnBufferSize = INITIAL_UNICODE_BUFFER_CAPACITY;
+		mpBuffer = new sal_Unicode[ mnBufferSize ];
+	}
+
+	// Only for bFindLineEnd
+	sal_Unicode cLineEndChar1 = 0x13;
+	sal_Unicode cLineEndChar2 = 0x10;
+
+	sal_Int32 nBufferReadPos = 0;
+	sal_Int32 nCopyLen = 0;
+	sal_Bool bFound = sal_False;
+	sal_Bool bFoundFirstLineEndChar = sal_False;
+	sal_Unicode cFirstLineEndChar;
+	const sal_Unicode* pDelims = Delimiters.getConstArray();
+	const sal_Int32 nDelimCount = Delimiters.getLength();
+	while( !bFound )
+	{
+		// Still characters available?
+		if( nBufferReadPos == mnCharsInBuffer )
+		{
+			// Already reached EOF? Then we can't read any more
+			if( mbReachedEOF )
+				break;
+
+			// No, so read new characters
+			if( !implReadNext() )
+				break;
+
+			/*
+			sal_Int32 nFreeBufferSize = mnBufferSize - nBufferReadPos;
+			if( nFreeBufferSize < READ_BYTE_COUNT )
+				implResizeBuffer();
+
+			try
+			{
+				Sequence< sal_Int8 > aData;
+				sal_Int32 nBytesToRead = READ_BYTE_COUNT;
+				sal_Int32 nRead = mxStream->readSomeBytes( aData, nBytesToRead );
+				if( nRead < nBytesToRead )
+					bEOF = sal_True;
+
+				// Try to convert
+				sal_uInt32 uiInfo;
+				sal_Size nSrcCvtBytes = 0;
+				sal_Size nTargetCount = 0;
+				sal_Size nSourceCount = 0;
+				while( sal_True )
+				{
+					const sal_Int8 *pbSource = aData.getConstArray();
+
+					//// the whole source size
+					//sal_Int32 nSourceSize = seqText.getLength() + m_seqSource.getLength();
+					//Sequence<sal_Unicode> 	seqUnicode ( nSourceSize );
+//					
+					//const sal_Int8 *pbSource = seqText.getConstArray();
+					//sal_Int8 *pbTempMem = 0;
+//
+					//if( m_seqSource.getLength() ) {
+						//// put old rest and new byte sequence into one array
+						//pbTempMem = new sal_Int8[ nSourceSize ];
+						//memcpy( pbTempMem , m_seqSource.getConstArray() , m_seqSource.getLength() );
+						//memcpy( &(pbTempMem[ m_seqSource.getLength() ]) , seqText.getConstArray() , seqText.getLength() );
+						//pbSource = pbTempMem;
+//
+						//// set to zero again
+						//m_seqSource = Sequence< sal_Int8 >();
+					//}
+
+					// All invalid characters are transformed to the unicode undefined char
+					nTargetCount += rtl_convertTextToUnicode(   
+										mConvText2Unicode,
+										mContextText2Unicode,
+										(const sal_Char*) &( pbSource[nSourceCount] ),
+										nRead - nSourceCount,
+										mpBuffer + nBufferReadPos + nTargetCount,
+										mnBufferSize - nBufferReadPos - nTargetCount,
+										RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT   |
+										RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
+										RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
+										&uiInfo,
+										&nSrcCvtBytes );
+					nSourceCount += nSrcCvtBytes;
+									
+					sal_Bool bCont = sal_False;
+					if( uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL ) 
+					{
+						implResizeBuffer();
+						bCont = sal_True;
+					}
+
+					if( uiInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL ) 
+					{
+						// read next byte
+						static Sequence< sal_Int8 > aOneByteSeq( 1 );
+						sal_Int32 nRead = mxStream->readSomeBytes( aData, 1 );
+						if( nRead == 0 )
+						{
+							bEOF = sal_True;
+
+							// return what we have
+							// TODO
+						}
+						sal_Int32 nOldLen = aData.getLength();
+						aData.realloc( nOldLen + 1 );
+						aData.getArray()[ nOldLen ] = aOneByteSeq.getConstArray()[ 0 ];
+						pbSource = aData.getConstArray();
+						bCont = sal_True;
+					}
+
+					if( bCont )
+						continue;
+					break;
+				}
+
+				mnCharsInBuffer += nTargetCount;
+			}
+			catch( NotConnectedException& e1 )
+			{
+				e1;
+				throw IOException();
+				//throw IOException( L"OTextInputStream::implReadString failed" );
+			}
+			catch( BufferSizeExceededException& e2 )
+			{
+				e2;
+				throw IOException();
+			}
+			*/
+		}
+
+		// Now there should be characters available 
+		// (otherwise the loop should have been breaked before)
+		sal_Unicode	c = mpBuffer[ nBufferReadPos++ ];
+
+		if( bFindLineEnd )
+		{
+			if( bFoundFirstLineEndChar )
+			{
+				bFound = sal_True;
+				nCopyLen = nBufferReadPos - 2;
+				if( c == cLineEndChar1 || c == cLineEndChar2 )
+				{
+					// Same line end char -> new line break
+					if( c == cFirstLineEndChar )
+					{
+						nBufferReadPos--;
+					}
+				}
+			}
+			else if( c == cLineEndChar1 || c == cLineEndChar2 )
+			{
+				bFoundFirstLineEndChar = sal_True;
+				cFirstLineEndChar = c;
+			}
+		}
+		else
+		{
+			for( sal_Int32 i = 0 ; i < nDelimCount ; i++ )
+			{
+				if( c == pDelims[ i ] )
+				{
+					bFound = sal_True;
+					nCopyLen = nBufferReadPos;
+					if( bRemoveDelimiter )
+						nCopyLen--;
+				}
+			}
+		}
+	}
+
+	// Create string
+	if( nCopyLen )
+		aRetStr = OUString( mpBuffer, nCopyLen );
+
+	// Copy rest of buffer
+	memmove( mpBuffer, mpBuffer + nBufferReadPos, 
+		(mnCharsInBuffer - nBufferReadPos) * sizeof( sal_Unicode ) );
+	mnCharsInBuffer -= nBufferReadPos;
+
+	return aRetStr;
+}
+
+
+sal_Int32 OTextInputStream::implReadNext() 
+		throw(IOException, RuntimeException)
+{
+	sal_Int32 nFreeBufferSize = mnBufferSize - mnCharsInBuffer;
+	if( nFreeBufferSize < READ_BYTE_COUNT )
+		implResizeBuffer();
+	nFreeBufferSize = mnBufferSize - mnCharsInBuffer;
+
+	try
+	{
+		Sequence< sal_Int8 > aData;
+		sal_Int32 nBytesToRead = READ_BYTE_COUNT;
+		sal_Int32 nRead = mxStream->readSomeBytes( aData, nBytesToRead );
+		if( nRead < nBytesToRead )
+			mbReachedEOF = sal_True;
+
+		// Try to convert
+		sal_uInt32 uiInfo;
+		sal_Size nSrcCvtBytes = 0;
+		sal_Size nTargetCount = 0;
+		sal_Size nSourceCount = 0;
+		while( sal_True )
+		{
+			const sal_Int8 *pbSource = aData.getConstArray();
+
+			//// the whole source size
+			//sal_Int32 nSourceSize = seqText.getLength() + m_seqSource.getLength();
+			//Sequence<sal_Unicode> 	seqUnicode ( nSourceSize );
+//					
+			//const sal_Int8 *pbSource = seqText.getConstArray();
+			//sal_Int8 *pbTempMem = 0;
+//
+			//if( m_seqSource.getLength() ) {
+				//// put old rest and new byte sequence into one array
+				//pbTempMem = new sal_Int8[ nSourceSize ];
+				//memcpy( pbTempMem , m_seqSource.getConstArray() , m_seqSource.getLength() );
+				//memcpy( &(pbTempMem[ m_seqSource.getLength() ]) , seqText.getConstArray() , seqText.getLength() );
+				//pbSource = pbTempMem;
+//
+				//// set to zero again
+				//m_seqSource = Sequence< sal_Int8 >();
+			//}
+
+			// All invalid characters are transformed to the unicode undefined char
+			nTargetCount += rtl_convertTextToUnicode(   
+								mConvText2Unicode,
+								mContextText2Unicode,
+								(const sal_Char*) &( pbSource[nSourceCount] ),
+								nRead - nSourceCount,
+								mpBuffer + mnCharsInBuffer + nTargetCount,
+								nFreeBufferSize - nTargetCount,
+								RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT   |
+								RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
+								RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
+								&uiInfo,
+								&nSrcCvtBytes );
+			nSourceCount += nSrcCvtBytes;
+							
+			sal_Bool bCont = sal_False;
+			if( uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL ) 
+			{
+				implResizeBuffer();
+				bCont = sal_True;
+			}
+
+			if( uiInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL ) 
+			{
+				// read next byte
+				static Sequence< sal_Int8 > aOneByteSeq( 1 );
+				sal_Int32 nRead = mxStream->readSomeBytes( aData, 1 );
+				if( nRead == 0 )
+				{
+					mbReachedEOF = sal_True;
+					break;
+				}
+				sal_Int32 nOldLen = aData.getLength();
+				aData.realloc( nOldLen + 1 );
+				aData.getArray()[ nOldLen ] = aOneByteSeq.getConstArray()[ 0 ];
+				pbSource = aData.getConstArray();
+				bCont = sal_True;
+			}
+
+			if( bCont )
+				continue;
+			break;
+		}
+
+		mnCharsInBuffer += nTargetCount;
+		return nTargetCount;
+	}
+	catch( NotConnectedException& e1 )
+	{
+		e1;
+		throw IOException();
+		//throw IOException( L"OTextInputStream::implReadString failed" );
+	}
+	catch( BufferSizeExceededException& e2 )
+	{
+		e2;
+		throw IOException();
+	}
+}
+
+
+/*
+OUString OTextInputStream::implConvert( const Sequence<sal_Int8> &seqText )
+{
+	sal_uInt32 uiInfo;
+	sal_Size nSrcCvtBytes 	= 0;
+	sal_Size nTargetCount 	= 0;
+	sal_Size nSourceCount   = 0;
+
+	// the whole source size
+	sal_Int32 nSourceSize = seqText.getLength() + m_seqSource.getLength();
+	Sequence<sal_Unicode> 	seqUnicode ( nSourceSize );
+	
+	const sal_Int8 *pbSource = seqText.getConstArray();
+	sal_Int8 *pbTempMem = 0;
+
+	if( m_seqSource.getLength() ) {
+		// put old rest and new byte sequence into one array
+		pbTempMem = new sal_Int8[ nSourceSize ];
+		memcpy( pbTempMem , m_seqSource.getConstArray() , m_seqSource.getLength() );
+		memcpy( &(pbTempMem[ m_seqSource.getLength() ]) , seqText.getConstArray() , seqText.getLength() );
+		pbSource = pbTempMem;
+
+		// set to zero again
+		m_seqSource = Sequence< sal_Int8 >();
+	}
+
+	while( sal_True ) {
+
+		// All invalid characters are transformed to the unicode undefined char
+		nTargetCount += 	rtl_convertTextToUnicode(   
+									m_convText2Unicode,
+									m_contextText2Unicode,
+									( const sal_Char * ) &( pbSource[nSourceCount] ),
+									nSourceSize - nSourceCount ,
+									&( seqUnicode.getArray()[ nTargetCount ] ),
+									seqUnicode.getLength() - nTargetCount,
+									RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT   |
+									RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
+									RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
+									&uiInfo,
+									&nSrcCvtBytes );
+		nSourceCount += nSrcCvtBytes;
+						
+		if( uiInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL ) {
+			// save necessary bytes for next conversion
+			seqUnicode.realloc( seqUnicode.getLength() * 2 );
+			continue;
+		}
+		break;
+	}
+	if( uiInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL ) {
+		m_seqSource.realloc( nSourceSize - nSourceCount );
+		memcpy( m_seqSource.getArray() , &(pbSource[nSourceCount]) , nSourceSize-nSourceCount );
+	}
+	
+
+	if( pbTempMem ) {
+		delete pbTempMem;	
+	}
+
+	// set to correct unicode size 
+	seqUnicode.realloc( nTargetCount );
+
+	return seqUnicode;
+}
+*/
+
+void OTextInputStream::setEncoding( const OUString& Encoding ) 
+	throw(RuntimeException)
+{
+	OString aOEncodingStr = OUStringToOString( Encoding, RTL_TEXTENCODING_ASCII_US );
+	rtl_TextEncoding encoding = rtl_getTextEncodingFromMimeCharset( aOEncodingStr.getStr() );
+	if( RTL_TEXTENCODING_DONTKNOW == encoding ) 
+		return;
+
+	mbEncodingInitialized = true;
+	mConvText2Unicode = rtl_createTextToUnicodeConverter( encoding );
+	mContextText2Unicode = rtl_createTextToUnicodeContext( mConvText2Unicode );
+	mEncoding = Encoding;
+}
+
+//===========================================================================
+// XInputStream
+
+sal_Int32 OTextInputStream::readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) 
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	return mxStream->readBytes( aData, nBytesToRead );
+}
+
+sal_Int32 OTextInputStream::readSomeBytes( Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead )
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	return mxStream->readSomeBytes( aData, nMaxBytesToRead );
+}
+
+void OTextInputStream::skipBytes( sal_Int32 nBytesToSkip )
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	mxStream->skipBytes( nBytesToSkip );
+}
+
+sal_Int32 OTextInputStream::available(  ) 
+	throw(NotConnectedException, IOException, RuntimeException)
+{
+	return mxStream->available();
+}
+
+void OTextInputStream::closeInput(  ) 
+	throw(NotConnectedException, IOException, RuntimeException)
+{
+	mxStream->closeInput();
+}
+
+
+
+
+//===========================================================================
+// XActiveDataSink
+
+void OTextInputStream::setInputStream( const Reference< XInputStream >& aStream ) 
+	throw(RuntimeException)
+{
+	mxStream = aStream;
+}
+
+Reference< XInputStream > OTextInputStream::getInputStream()
+	throw(RuntimeException)
+{
+	return mxStream;
+}
+
+
+Reference< XInterface > SAL_CALL TextInputStream_CreateInstance( const Reference< XMultiServiceFactory > &)
+{
+	return Reference < XInterface >( ( OWeakObject * ) new OTextInputStream() );
+}
+
+
+Sequence< OUString > TextInputStream_getSupportedServiceNames()
+{
+	static Sequence < OUString > *pNames = 0;
+	if( ! pNames )
+	{
+		MutexGuard guard( Mutex::getGlobalMutex() );
+		if( !pNames )
+		{
+			static Sequence< OUString > seqNames(1);
+			seqNames.getArray()[0] = OUString::createFromAscii( SERVICE_NAME );
+			pNames = &seqNames;
+		}
+	}
+	return *pNames;
+}
+
+
+}
+
+
+//==================================================================================================
+// Component exports
+
+extern "C"
+{
+//==================================================================================================
+void SAL_CALL component_getImplementationEnvironment(
+	const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
+{
+	*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+//==================================================================================================
+sal_Bool SAL_CALL component_writeInfo(
+	void * pServiceManager, void * pRegistryKey )
+{
+	if (pRegistryKey)
+	{
+		try
+		{
+			Reference< XRegistryKey > xNewKey(
+				reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+					OUString::createFromAscii("/" IMPLEMENTATION_NAME "/UNO/SERVICES" ) ) );
+			
+			const Sequence< OUString > & rSNL = io_TextStream::TextInputStream_getSupportedServiceNames();
+			const OUString * pArray = rSNL.getConstArray();
+			for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
+				xNewKey->createKey( pArray[nPos] );
+			
+			return sal_True;
+		}
+		catch (InvalidRegistryException &)
+		{
+			OSL_ENSHURE( sal_False, "### InvalidRegistryException!" );
+		}
+	}
+	return sal_False;
+}
+//==================================================================================================
+void * SAL_CALL component_getFactory(
+	const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey )
+{
+	void * pRet = 0;
+	
+	if (pServiceManager && rtl_str_compare( pImplName, IMPLEMENTATION_NAME ) == 0)
+	{
+		Reference< XSingleServiceFactory > xFactory( createSingleFactory(
+			reinterpret_cast< XMultiServiceFactory * >( pServiceManager ),
+			OUString::createFromAscii( pImplName ),
+			io_TextStream::TextInputStream_CreateInstance, 
+			io_TextStream::TextInputStream_getSupportedServiceNames() ) );
+		
+		if (xFactory.is())
+		{
+			xFactory->acquire();
+			pRet = xFactory.get();
+		}
+	}
+	
+	return pRet;
+}
+}
+
+

File io/source/TextInputStream/makefile.mk

+#*************************************************************************
+#
+#   $RCSfile: makefile.mk,v $
+#
+#   $Revision: 1.1.1.1 $
+#
+#   last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+#
+#   The Contents of this file are made available subject to the terms of
+#   either of the following licenses
+#
+#          - GNU Lesser General Public License Version 2.1
+#          - Sun Industry Standards Source License Version 1.1
+#
+#   Sun Microsystems Inc., October, 2000
+#
+#   GNU Lesser General Public License Version 2.1
+#   =============================================
+#   Copyright 2000 by Sun Microsystems, Inc.
+#   901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+#   This library is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU Lesser General Public
+#   License version 2.1, as published by the Free Software Foundation.
+#
+#   This library is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   Lesser General Public License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public
+#   License along with this library; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+#   MA  02111-1307  USA
+#
+#
+#   Sun Industry Standards Source License Version 1.1
+#   =================================================
+#   The contents of this file are subject to the Sun Industry Standards
+#   Source License Version 1.1 (the "License"); You may not use this file
+#   except in compliance with the License. You may obtain a copy of the
+#   License at http://www.openoffice.org/license.html.
+#
+#   Software provided under this License is provided on an "AS IS" basis,
+#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+#   See the License for the specific provisions governing your rights and
+#   obligations concerning the Software.
+#
+#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+#
+#   Copyright: 2000 by Sun Microsystems, Inc.
+#
+#   All Rights Reserved.
+#
+#   Contributor(s): _______________________________________
+#
+#
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=io
+TARGET=tinstrm
+ENABLE_EXCEPTIONS=TRUE
+NO_BSYMBOLIC=TRUE
+
+# --- Settings -----------------------------------------------------
+.INCLUDE :  svpre.mk
+.INCLUDE :  settings.mk
+.INCLUDE :  sv.mk
+# ------------------------------------------------------------------
+
+SLOFILES= \
+	$(SLO)$/TextInputStream.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1STDLIBS= \
+		$(SALLIB)	\
+		$(CPPULIB) 	\
+		$(VOSLIB)       \
+		$(TOOLSLIB)       \
+		$(UCBHELPERLIB)       \
+		$(CPPUHELPERLIB) 
+
+SHL1DEPN=
+SHL1IMPLIB=		i$(TARGET)
+SHL1LIBS=		$(SLB)$/$(TARGET).lib
+SHL1DEF=		$(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME=		$(SHL1TARGET)
+DEF1EXPORTFILE=	exports.dxp
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :	target.mk

File io/source/TextOutputStream/TextOutputStream.cxx

+/*************************************************************************
+ *
+ *  $RCSfile: TextOutputStream.cxx,v $
+ *
+ *  $Revision: 1.1.1.1 $
+ *
+ *  last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+ *
+ *  The Contents of this file are made available subject to the terms of
+ *  either of the following licenses
+ *
+ *         - GNU Lesser General Public License Version 2.1
+ *         - Sun Industry Standards Source License Version 1.1
+ *
+ *  Sun Microsystems Inc., October, 2000
+ *
+ *  GNU Lesser General Public License Version 2.1
+ *  =============================================
+ *  Copyright 2000 by Sun Microsystems, Inc.
+ *  901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1, as published by the Free Software Foundation.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *  MA  02111-1307  USA
+ *
+ *
+ *  Sun Industry Standards Source License Version 1.1
+ *  =================================================
+ *  The contents of this file are subject to the Sun Industry Standards
+ *  Source License Version 1.1 (the "License"); You may not use this file
+ *  except in compliance with the License. You may obtain a copy of the
+ *  License at http://www.openoffice.org/license.html.
+ *
+ *  Software provided under this License is provided on an "AS IS" basis,
+ *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ *  See the License for the specific provisions governing your rights and
+ *  obligations concerning the Software.
+ *
+ *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ *  Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ *  All Rights Reserved.
+ *
+ *  Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+
+#include <osl/mutex.hxx>
+#include <osl/diagnose.h>
+
+#include <uno/mapping.hxx>
+
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase2.hxx>
+
+#include <rtl/textenc.h>
+#include <rtl/tencinfo.h>
+
+#include <com/sun/star/io/XTextOutputStream.hpp>
+#include <com/sun/star/io/XActiveDataSource.hpp>
+
+
+#define IMPLEMENTATION_NAME "com.sun.star.comp.io.TextOutputStream"
+#define SERVICE_NAME "com.sun.star.io.TextOutputStream"
+
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::cppu;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::registry;
+
+
+namespace io_TextStream
+{
+
+//===========================================================================
+// Implementation XTextOutputStream
+
+typedef WeakImplHelper2< XTextOutputStream, XActiveDataSource > TextOutputStreamHelper;
+class OCommandEnvironment;
+
+class OTextOutputStream : public TextOutputStreamHelper
+{
+	Reference< XOutputStream > mxStream;
+
+	// Encoding
+	OUString mEncoding;
+	sal_Bool mbEncodingInitialized;
+	rtl_UnicodeToTextConverter 	mConvUnicode2Text;
+	rtl_UnicodeToTextContext   	mContextUnicode2Text;
+
+	Sequence<sal_Int8> implConvert( const OUString& rSource );
+
+public:
+	OTextOutputStream();
+	~OTextOutputStream();
+
+    // Methods XTextOutputStream
+    virtual void SAL_CALL writeString( const OUString& aString ) 
+		throw(IOException, RuntimeException);
+    virtual void SAL_CALL setEncoding( const OUString& Encoding ) 
+		throw(RuntimeException);
+
+    // Methods XOutputStream
+    virtual void SAL_CALL writeBytes( const Sequence< sal_Int8 >& aData ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+    virtual void SAL_CALL flush(  ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+    virtual void SAL_CALL closeOutput(  ) 
+		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException);
+
+    // Methods XActiveDataSource
+    virtual void SAL_CALL setOutputStream( const Reference< XOutputStream >& aStream ) 
+		throw(RuntimeException);
+    virtual Reference< XOutputStream > SAL_CALL getOutputStream(  ) 
+		throw(RuntimeException);
+};
+
+OTextOutputStream::OTextOutputStream()
+{
+	mbEncodingInitialized = false;
+}
+
+OTextOutputStream::~OTextOutputStream()
+{
+	if( mbEncodingInitialized )
+	{
+		rtl_destroyUnicodeToTextContext( mConvUnicode2Text, mContextUnicode2Text );
+		rtl_destroyUnicodeToTextConverter( mConvUnicode2Text );
+	}
+}
+
+Sequence<sal_Int8> OTextOutputStream::implConvert( const OUString& rSource )
+{
+	const sal_Unicode *puSource = rSource.getStr();
+	sal_Int32 nSourceSize = rSource.getLength();
+
+	sal_Size nTargetCount = 0;
+	sal_Size nSourceCount = 0;
+	
+	sal_uInt32 uiInfo;
+	sal_Size nSrcCvtChars;
+
+	// take nSourceSize * 3 as preference
+	// this is an upper boundary for converting to utf8,
+	// which most often used as the target.
+	sal_Int32 nSeqSize =  nSourceSize * 3;
+
+	Sequence<sal_Int8> seqText( nSeqSize );
+	sal_Char *pTarget = (sal_Char *) seqText.getArray();
+	while( sal_True ) 
+	{
+		nTargetCount += rtl_convertUnicodeToText(
+									mConvUnicode2Text,
+									mContextUnicode2Text,
+									&( puSource[nSourceCount] ),
+									nSourceSize - nSourceCount ,
+									&( pTarget[nTargetCount] ),
+									nSeqSize - nTargetCount,
+									RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |
+									RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT ,
+									&uiInfo,
+									&nSrcCvtChars);
+		nSourceCount += nSrcCvtChars;
+		
+		if( uiInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL ) 
+		{
+			nSeqSize *= 2;
+			seqText.realloc( nSeqSize );  // double array size
+			pTarget = (sal_Char*) seqText.getArray();
+			continue;
+		}
+		break;
+	}
+
+	// reduce the size of the buffer (fast, no copy necessary)
+	seqText.realloc( nTargetCount );
+	return seqText;
+}
+
+
+//===========================================================================
+// XTextOutputStream
+
+void OTextOutputStream::writeString( const OUString& aString ) 
+	throw(IOException, RuntimeException)
+{
+	if( !mbEncodingInitialized )
+	{
+		OUString aUtf8Str( RTL_CONSTASCII_USTRINGPARAM("utf8") );
+		setEncoding( aUtf8Str );
+	}
+	if( !mbEncodingInitialized )
+		return;
+
+	Sequence<sal_Int8> aByteSeq = implConvert( aString );
+	mxStream->writeBytes( aByteSeq );
+}
+
+void OTextOutputStream::setEncoding( const OUString& Encoding ) 
+	throw(RuntimeException)
+{
+	OString aOEncodingStr = OUStringToOString( Encoding, RTL_TEXTENCODING_ASCII_US );
+	rtl_TextEncoding encoding = rtl_getTextEncodingFromMimeCharset( aOEncodingStr.getStr() );
+	if( RTL_TEXTENCODING_DONTKNOW == encoding ) 
+		return;
+
+	mbEncodingInitialized = true;
+	mConvUnicode2Text 	= rtl_createUnicodeToTextConverter( encoding );
+	mContextUnicode2Text = rtl_createUnicodeToTextContext( mConvUnicode2Text );
+	mEncoding = Encoding;
+}
+
+//===========================================================================
+// XOutputStream
+void OTextOutputStream::writeBytes( const Sequence< sal_Int8 >& aData ) 
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	mxStream->writeBytes( aData );
+}
+
+void OTextOutputStream::flush(  ) 
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	mxStream->flush();
+}
+
+void OTextOutputStream::closeOutput(  ) 
+	throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
+{
+	mxStream->closeOutput();
+}
+
+
+//===========================================================================
+// XActiveDataSource
+
+void OTextOutputStream::setOutputStream( const Reference< XOutputStream >& aStream ) 
+	throw(RuntimeException)
+{
+	mxStream = aStream;
+}
+
+Reference< XOutputStream > OTextOutputStream::getOutputStream()
+	throw(RuntimeException)
+{
+	return mxStream;
+}
+
+
+Reference< XInterface > SAL_CALL TextOutputStream_CreateInstance( const Reference< XMultiServiceFactory > &)
+{
+	return Reference < XInterface >( ( OWeakObject * ) new OTextOutputStream() );
+}
+
+
+Sequence< OUString > TextOutputStream_getSupportedServiceNames()
+{
+	static Sequence < OUString > *pNames = 0;
+	if( ! pNames )
+	{
+		MutexGuard guard( Mutex::getGlobalMutex() );
+		if( !pNames )
+		{
+			static Sequence< OUString > seqNames(1);
+			seqNames.getArray()[0] = OUString::createFromAscii( SERVICE_NAME );
+			pNames = &seqNames;
+		}
+	}
+	return *pNames;
+}
+
+
+}
+
+
+//==================================================================================================
+// Component exports
+
+extern "C"
+{
+//==================================================================================================
+void SAL_CALL component_getImplementationEnvironment(
+	const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
+{
+	*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+//==================================================================================================
+sal_Bool SAL_CALL component_writeInfo(
+	void * pServiceManager, void * pRegistryKey )
+{
+	if (pRegistryKey)
+	{
+		try
+		{
+			Reference< XRegistryKey > xNewKey(
+				reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+					OUString::createFromAscii("/" IMPLEMENTATION_NAME "/UNO/SERVICES" ) ) );
+			
+			const Sequence< OUString > & rSNL = io_TextStream::TextOutputStream_getSupportedServiceNames();
+			const OUString * pArray = rSNL.getConstArray();
+			for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
+				xNewKey->createKey( pArray[nPos] );
+			
+			return sal_True;
+		}
+		catch (InvalidRegistryException &)
+		{
+			OSL_ENSHURE( sal_False, "### InvalidRegistryException!" );
+		}
+	}
+	return sal_False;
+}
+//==================================================================================================
+void * SAL_CALL component_getFactory(
+	const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey )
+{
+	void * pRet = 0;
+	
+	if (pServiceManager && rtl_str_compare( pImplName, IMPLEMENTATION_NAME ) == 0)
+	{
+		Reference< XSingleServiceFactory > xFactory( createSingleFactory(
+			reinterpret_cast< XMultiServiceFactory * >( pServiceManager ),
+			OUString::createFromAscii( pImplName ),
+			io_TextStream::TextOutputStream_CreateInstance, 
+			io_TextStream::TextOutputStream_getSupportedServiceNames() ) );
+		
+		if (xFactory.is())
+		{
+			xFactory->acquire();
+			pRet = xFactory.get();
+		}
+	}
+	
+	return pRet;
+}
+}
+
+

File io/source/TextOutputStream/makefile.mk

+#*************************************************************************
+#
+#   $RCSfile: makefile.mk,v $
+#
+#   $Revision: 1.1.1.1 $
+#
+#   last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+#
+#   The Contents of this file are made available subject to the terms of
+#   either of the following licenses
+#
+#          - GNU Lesser General Public License Version 2.1
+#          - Sun Industry Standards Source License Version 1.1
+#
+#   Sun Microsystems Inc., October, 2000
+#
+#   GNU Lesser General Public License Version 2.1
+#   =============================================
+#   Copyright 2000 by Sun Microsystems, Inc.
+#   901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+#   This library is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU Lesser General Public
+#   License version 2.1, as published by the Free Software Foundation.
+#
+#   This library is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   Lesser General Public License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public
+#   License along with this library; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+#   MA  02111-1307  USA
+#
+#
+#   Sun Industry Standards Source License Version 1.1
+#   =================================================
+#   The contents of this file are subject to the Sun Industry Standards
+#   Source License Version 1.1 (the "License"); You may not use this file
+#   except in compliance with the License. You may obtain a copy of the
+#   License at http://www.openoffice.org/license.html.
+#
+#   Software provided under this License is provided on an "AS IS" basis,
+#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+#   See the License for the specific provisions governing your rights and
+#   obligations concerning the Software.
+#
+#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+#
+#   Copyright: 2000 by Sun Microsystems, Inc.
+#
+#   All Rights Reserved.
+#
+#   Contributor(s): _______________________________________
+#
+#
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=io
+TARGET=toutstrm
+ENABLE_EXCEPTIONS=TRUE
+NO_BSYMBOLIC=TRUE
+
+# --- Settings -----------------------------------------------------
+.INCLUDE :  svpre.mk
+.INCLUDE :  settings.mk
+.INCLUDE :  sv.mk
+# ------------------------------------------------------------------
+
+SLOFILES= \
+	$(SLO)$/TextOutputStream.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1STDLIBS= \
+		$(SALLIB)	\
+		$(CPPULIB) 	\
+		$(VOSLIB)       \
+		$(TOOLSLIB)       \
+		$(UCBHELPERLIB)       \
+		$(CPPUHELPERLIB) 
+
+SHL1DEPN=
+SHL1IMPLIB=		i$(TARGET)
+SHL1LIBS=		$(SLB)$/$(TARGET).lib
+SHL1DEF=		$(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME=		$(SHL1TARGET)
+DEF1EXPORTFILE=	exports.dxp
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :	target.mk

File io/source/acceptor/acc_pipe.cxx

+/*************************************************************************
+ *
+ *  $RCSfile: acc_pipe.cxx,v $
+ *
+ *  $Revision: 1.1.1.1 $
+ *
+ *  last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+ *
+ *  The Contents of this file are made available subject to the terms of
+ *  either of the following licenses
+ *
+ *         - GNU Lesser General Public License Version 2.1
+ *         - Sun Industry Standards Source License Version 1.1
+ *
+ *  Sun Microsystems Inc., October, 2000
+ *
+ *  GNU Lesser General Public License Version 2.1
+ *  =============================================
+ *  Copyright 2000 by Sun Microsystems, Inc.
+ *  901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1, as published by the Free Software Foundation.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *  MA  02111-1307  USA
+ *
+ *
+ *  Sun Industry Standards Source License Version 1.1
+ *  =================================================
+ *  The contents of this file are subject to the Sun Industry Standards
+ *  Source License Version 1.1 (the "License"); You may not use this file
+ *  except in compliance with the License. You may obtain a copy of the
+ *  License at http://www.openoffice.org/license.html.
+ *
+ *  Software provided under this License is provided on an "AS IS" basis,
+ *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ *  See the License for the specific provisions governing your rights and
+ *  obligations concerning the Software.
+ *
+ *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ *  Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ *  All Rights Reserved.
+ *
+ *  Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#include "acceptor.hxx"
+#include <com/sun/star/connection/ConnectionSetupException.hpp>
+
+#include <cppuhelper/implbase1.hxx>
+
+using namespace ::vos;
+using namespace ::rtl;
+using namespace ::cppu;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::connection;
+using namespace ::com::sun::star::io;
+
+
+namespace stoc_acceptor
+{
+
+	typedef WeakImplHelper1< XConnection > MyPipeConnection;
+	
+	class PipeConnection :
+		public MyPipeConnection
+	{
+	public:
+		PipeConnection( const OUString & s , sal_Bool bIgnoreClose);
+
+		virtual sal_Int32 SAL_CALL read( Sequence< sal_Int8 >& aReadBytes, sal_Int32 nBytesToRead )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL write( const Sequence< sal_Int8 >& aData )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL flush(  ) throw(
+			::com::sun::star::io::IOException,
+			::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL close(  )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual ::rtl::OUString SAL_CALL getDescription(  )
+			throw(::com::sun::star::uno::RuntimeException);
+	public:
+		::vos::OStreamPipe m_pipe;
+		oslInterlockedCount m_nStatus;
+		OUString m_sDescription;
+		sal_Bool m_bIgnoreClose;
+	};
+
+	
+
+	PipeConnection::PipeConnection( const OUString &s , sal_Bool bIgnoreClose) :
+		m_nStatus( 0 ),
+		m_sDescription( OUString::createFromAscii( "pipe:" ) ),
+		m_bIgnoreClose( bIgnoreClose )
+	{
+		m_sDescription += s;
+		m_sDescription += OUString::createFromAscii( ":" );
+
+		// make it unique
+		m_sDescription += OUString::valueOf( (sal_Int64) (OObject * ) &m_pipe , 10 );
+	}
+
+	sal_Int32 PipeConnection::read( Sequence < sal_Int8 > & aReadBytes , sal_Int32 nBytesToRead )
+		throw(::com::sun::star::io::IOException,
+			  ::com::sun::star::uno::RuntimeException)
+	{
+		if( ! m_nStatus )
+		{
+			if( aReadBytes.getLength() != nBytesToRead )
+			{
+				aReadBytes.realloc( nBytesToRead );
+			}
+			return m_pipe.read( aReadBytes.getArray()  , aReadBytes.getLength() );
+		}
+		else {
+			throw IOException();
+		}
+
+		return 0;
+	}
+
+	void PipeConnection::write( const Sequence < sal_Int8 > &seq )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException)
+	{
+		if( ! m_nStatus )
+		{
+			if( m_pipe.write( seq.getConstArray() , seq.getLength() ) != seq.getLength() )
+			{
+				throw IOException();
+			}
+		}
+		else {
+			throw IOException();
+		}
+	}
+
+	void PipeConnection::flush( )
+		throw(	::com::sun::star::io::IOException,
+				::com::sun::star::uno::RuntimeException)
+	{
+	}
+
+	void PipeConnection::close()
+		throw( ::com::sun::star::io::IOException,
+			   ::com::sun::star::uno::RuntimeException)
+	{
+		if( ! m_bIgnoreClose && 1 == osl_incrementInterlockedCount( (&m_nStatus) ) )
+		{
+			m_pipe.close();
+		}
+	}
+
+	OUString PipeConnection::getDescription()
+			throw(::com::sun::star::uno::RuntimeException)
+	{
+		return m_sDescription;
+	}
+	
+	/***************
+	 * PipeAcceptor 
+	 **************/
+	PipeAcceptor::PipeAcceptor( const OUString &sPipeName , sal_Bool bIgnoreClose) :
+		m_bClosed( sal_False ),
+		m_sPipeName( sPipeName ),
+		m_bIgnoreClose( bIgnoreClose )
+	{
+	}
+
+
+	void PipeAcceptor::init()
+	{
+#ifdef ENABLEUNICODE
+		m_pipe.create( m_sPipeName.pData , ::vos::OPipe::TOption_Create );		
+#else
+		OString o = OUStringToOString( m_sPipeName , RTL_TEXTENCODING_ASCII_US );
+		m_pipe.create( o.pData->buffer , ::vos::OPipe::TOption_Create );
+#endif
+	}
+
+	Reference< XConnection > PipeAcceptor::accept( )
+	{
+		PipeConnection *pConn = new PipeConnection( m_sPipeName , m_bIgnoreClose );
+		
+		OPipe::TPipeError status = m_pipe.accept( pConn->m_pipe );
+
+		if( m_bClosed )
+		{
+			// stopAccepting was called !
+			delete pConn;
+			return Reference < XConnection >();
+		}
+		else if( OPipe::E_None == status )
+		{
+			return Reference < XConnection > ( (XConnection * ) pConn );
+		}
+		else
+		{
+			throw ConnectionSetupException();
+		}
+	}
+
+	void PipeAcceptor::stopAccepting()
+	{
+		m_bClosed = sal_True;
+		m_pipe.close();
+	}
+}

File io/source/acceptor/acc_socket.cxx

+/*************************************************************************
+ *
+ *  $RCSfile: acc_socket.cxx,v $
+ *
+ *  $Revision: 1.1.1.1 $
+ *
+ *  last change: $Author: hr $ $Date: 2000-09-18 17:24:17 $
+ *
+ *  The Contents of this file are made available subject to the terms of
+ *  either of the following licenses
+ *
+ *         - GNU Lesser General Public License Version 2.1
+ *         - Sun Industry Standards Source License Version 1.1
+ *
+ *  Sun Microsystems Inc., October, 2000
+ *
+ *  GNU Lesser General Public License Version 2.1
+ *  =============================================
+ *  Copyright 2000 by Sun Microsystems, Inc.
+ *  901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License version 2.1, as published by the Free Software Foundation.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *  MA  02111-1307  USA
+ *
+ *
+ *  Sun Industry Standards Source License Version 1.1
+ *  =================================================
+ *  The contents of this file are subject to the Sun Industry Standards
+ *  Source License Version 1.1 (the "License"); You may not use this file
+ *  except in compliance with the License. You may obtain a copy of the
+ *  License at http://www.openoffice.org/license.html.
+ *
+ *  Software provided under this License is provided on an "AS IS" basis,
+ *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ *  See the License for the specific provisions governing your rights and
+ *  obligations concerning the Software.
+ *
+ *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ *  Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ *  All Rights Reserved.
+ *
+ *  Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#include "acceptor.hxx"
+
+#include <stl/hash_set>
+
+#include <com/sun/star/connection/XConnectionBroadcaster.hpp>
+#include <com/sun/star/connection/ConnectionSetupException.hpp>
+
+#include <cppuhelper/implbase2.hxx>
+
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::cppu;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::connection;
+
+
+namespace stoc_acceptor {
+	static void callStarted(Reference<XStreamListener> xStreamListener)
+	{
+		xStreamListener->started();
+	}
+
+	struct callError {
+		const Any & any;
+
+		callError(const Any & any);
+
+		void operator () (Reference<XStreamListener> xStreamListener);
+	};
+
+	callError::callError(const Any & any)
+		: any(any)
+	{
+	}
+
+	void callError::operator () (Reference<XStreamListener> xStreamListener)
+	{
+		xStreamListener->error(any);
+	}
+
+	static void callClosed(Reference<XStreamListener> xStreamListener)
+	{
+		xStreamListener->closed();
+	}
+
+	
+	template<class T>
+	struct ReferenceHash
+	{
+		size_t operator () (const ::com::sun::star::uno::Reference<T> & ref) const
+        {
+			return (size_t)ref.get();
+		}
+	};
+
+	template<class T>
+	struct ReferenceEqual
+	{
+		sal_Bool operator () (const ::com::sun::star::uno::Reference<T> & op1, 
+							  const ::com::sun::star::uno::Reference<T> & op2) const
+        {
+			return op1.get() == op2.get();
+		}
+	};
+
+
+	class SocketConnection : public ::cppu::WeakImplHelper2< 
+        ::com::sun::star::connection::XConnection,
+		::com::sun::star::connection::XConnectionBroadcaster>
+	
+	{
+	public:
+		SocketConnection( const ::rtl::OUString & s , sal_uInt16 nPort , sal_Bool bIgnoreClose );
+
+		virtual sal_Int32 SAL_CALL read( ::com::sun::star::uno::Sequence< sal_Int8 >& aReadBytes,
+										 sal_Int32 nBytesToRead )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL write( const ::com::sun::star::uno::Sequence< sal_Int8 >& aData )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL flush(  ) throw(
+			::com::sun::star::io::IOException,
+			::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL close(  )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException);
+		virtual ::rtl::OUString SAL_CALL getDescription(  )
+			throw(::com::sun::star::uno::RuntimeException);
+
+		// XConnectionBroadcaster
+		virtual void SAL_CALL addStreamListener(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStreamListener>& aListener) 
+			throw(::com::sun::star::uno::RuntimeException);
+		virtual void SAL_CALL removeStreamListener(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStreamListener>& aListener) 
+			throw(::com::sun::star::uno::RuntimeException);
+
+	public:
+		::vos::OStreamSocket m_socket;
+		::vos::OInetSocketAddr m_addr;
+		oslInterlockedCount m_nStatus;
+		::rtl::OUString m_sDescription;
+		sal_Bool m_bIgnoreClose;
+
+		::osl::Mutex _mutex;
+		sal_Bool                             _firstRead;
+  		::std::hash_set< ::com::sun::star::uno::Reference< ::com::sun::star::io::XStreamListener>, 
+			  ReferenceHash< ::com::sun::star::io::XStreamListener>, 
+			  ReferenceEqual< ::com::sun::star::io::XStreamListener> > _listeners;
+	};
+
+	template<class T>
+	void notifyListeners(SocketConnection * pCon, T t)
+	{
+		::osl::MutexGuard guard(pCon->_mutex);
+		::std::for_each(pCon->_listeners.begin(), pCon->_listeners.end(), t);
+	}
+
+
+	SocketConnection::SocketConnection( const OUString &s,
+										sal_uInt16 nPort ,
+										sal_Bool bIgnoreClose) :
+		m_nStatus( 0 ),
+		m_sDescription( OUString::createFromAscii( "socket:" ) ),
+		m_bIgnoreClose( bIgnoreClose )
+	{
+		m_sDescription += s;
+		m_sDescription += OUString::createFromAscii( ":" );
+		m_sDescription += OUString::valueOf( (sal_Int32) nPort , 10 );
+		m_sDescription += OUString::createFromAscii( ":" );
+
+		// make it unique
+		m_sDescription += OUString::valueOf( (sal_Int64) (::vos::OObject * ) &m_socket , 10 );
+	}
+
+	sal_Int32 SocketConnection::read( Sequence < sal_Int8 > & aReadBytes , sal_Int32 nBytesToRead )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException)
+	{
+		if( ! m_nStatus )
+		{
+			if(_firstRead) {
+				_firstRead = false;
+				
+				notifyListeners(this, callStarted);
+			}
+
+			if( aReadBytes.getLength() != nBytesToRead )
+			{
+				aReadBytes.realloc( nBytesToRead );
+			}
+
+			sal_Int32 i = 0;
+			i = m_socket.read( aReadBytes.getArray()  , aReadBytes.getLength() );
+
+			if(i != nBytesToRead)
+			{
+				if(i < 0) // error?
+				{
+					OUString errMessage;
+					m_socket.getError(errMessage);
+					
+					OUString message(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketConnection::read: error - "));
+					message += errMessage;
+
+					IOException ioException(message, Reference<XInterface>(static_cast<XConnection *>(this)));
+
+					Any any;
+					any <<= ioException;
+					
+					notifyListeners(this, callError(any));
+					
+					throw ioException;
+				}
+				else  // connection closed!
+				{
+					notifyListeners(this, callClosed);
+				}
+			}
+
+			return i;
+		}
+		else
+		{
+			OUString message(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketConnection::read: error - connection already closed"));
+
+			IOException ioException(message, Reference<XInterface>(static_cast<XConnection *>(this)));
+
+			Any any;
+			any <<= ioException;
+
+			notifyListeners(this, callError(any));
+
+			throw ioException;
+		}
+	}
+
+	void SocketConnection::write( const Sequence < sal_Int8 > &seq )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException)
+	{
+		if( ! m_nStatus )
+		{
+			if( m_socket.write( seq.getConstArray() , seq.getLength() ) != seq.getLength() )
+			{
+				OUString errMessage;
+				m_socket.getError(errMessage);
+				
+				OUString message(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketConnection::write: error - "));
+				message += errMessage;
+				
+				IOException ioException(message, Reference<XInterface>(static_cast<XConnection *>(this)));
+				
+				Any any;
+				any <<= ioException;
+				
+				notifyListeners(this, callError(any));
+
+				throw ioException;
+			}
+		}
+		else
+		{
+			OUString message(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketConnection::write: error - connection already closed"));
+
+			IOException ioException(message, Reference<XInterface>(static_cast<XConnection *>(this)));
+
+			Any any;
+			any <<= ioException;
+
+			notifyListeners(this, callError(any));
+
+			throw ioException;
+		}
+	}
+
+	void SocketConnection::flush( )
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException)
+	{
+
+	}
+
+	void SocketConnection::close()
+			throw(::com::sun::star::io::IOException,
+				  ::com::sun::star::uno::RuntimeException)
+	{
+		// enshure close is called only once
+		if( ! m_bIgnoreClose && 1 == osl_incrementInterlockedCount( (&m_nStatus) ) )
+		{
+			m_socket.close();
+		}
+	}
+
+	OUString SocketConnection::getDescription()
+			throw( ::com::sun::star::uno::RuntimeException)
+	{
+		return m_sDescription;
+	}
+
+
+	// XConnectionBroadcaster
+	void SAL_CALL SocketConnection::addStreamListener(const Reference<XStreamListener> & aListener) throw(RuntimeException)
+	{
+		MutexGuard guard(_mutex);
+
+		_listeners.insert(aListener);
+	}
+
+	void SAL_CALL SocketConnection::removeStreamListener(const Reference<XStreamListener> & aListener) throw(RuntimeException)
+	{
+		MutexGuard guard(_mutex);
+
+		_listeners.erase(aListener);
+	}
+
+	SocketAcceptor::SocketAcceptor( const OUString &sSocketName ,
+									sal_uInt16 nPort ,
+									sal_Bool bIgnoreClose ) :
+		m_bClosed( sal_False ),
+		m_sSocketName( sSocketName ),
+		m_nPort( nPort ),
+		m_bIgnoreClose( bIgnoreClose )
+	{
+	}
+
+
+	void SocketAcceptor::init()
+	{
+		m_addr.setPort( m_nPort );
+#ifdef ENABLEUNICODE
+		m_addr.setAddr( m_sSocketName.pData );
+#else
+		OString o = OUStringToOString( m_sSocketName , RTL_TEXTENCODING_ASCII_US );
+		m_addr.setAddr( o.pData->buffer );
+#endif
+		m_socket.setReuseAddr(1);
+		
+		if(! m_socket.bind(m_addr) )
+		{
+			throw ConnectionSetupException(
+				OUString(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketAcceptor::init - error - couldn't bind")),
+				Reference<XInterface>());
+		}
+		
+		if(! m_socket.listen() )
+		{
+			throw ConnectionSetupException(
+				OUString(RTL_CONSTASCII_USTRINGPARAM("acc_socket.cxx:SocketAcceptor::init - error - can not listen")),
+				Reference<XInterface>());
+		}
+	}
+
+	Reference< XConnection > SocketAcceptor::accept( )
+	{
+		
+		SocketConnection *pConn = new SocketConnection( m_sSocketName , m_nPort, m_bIgnoreClose );
+
+		if( m_socket.acceptConnection( pConn->m_socket, pConn->m_addr )!= osl_Socket_Ok )
+		{
+			// stopAccepting was called
+			delete pConn;
+			return Reference < XConnection > ();
+		}
+		if( m_bClosed )
+		{