/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_io_XTextInputStream_idl__ 
#define __com_sun_star_io_XTextInputStream_idl__ 
 
#ifndef __com_sun_star_io_XInputStream_idl__ 
#include <com/sun/star/io/XInputStream.idl> 
#endif 
 
#ifndef __com_sun_star_io_IOException_idl__ 
#include <com/sun/star/io/IOException.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module io {  
 
//============================================================================= 
/** Interface to read strings from a stream.

	<p>This interfaces allows to read strings seperated by 
	delimiters and to read lines. The character encoding
	to be used can be set by <member>setEncoding()</member>.
	Default encoding is "utf8".</p>
 */
published interface XTextInputStream: com::sun::star::io::XInputStream
{ 
	//------------------------------------------------------------------------- 
	/** reads text until a line break (CR, LF, or CR/LF) or 
		EOF is found and returns it as string (without CR, LF). 

		<p>The read characters are converted according to the 
		encoding defined by <member>setEncoding</member>. If
		EOF is already reached before calling this method
		an empty string is returned.<p>

		@see setEncoding
		@see isEOF
	 */
	string readLine() 
			raises( com::sun::star::io::IOException ); 
 
	//------------------------------------------------------------------------- 
	/** reads text until one of the given delimiter characters 
		or EOF is found and returns it as string (without delimiter).

		<p><strong>Important:</strong> CR/LF is not used as default 
		delimiter! So if no delimiter is defined or none of the 
		delimiters is found, the stream will be read to EOF. The 
		read characters are converted according to the encoding
		defined by <member>setEncoding</member>. If EOF is already 
		reached before calling this method an empty string is returned.</p>

		@see setEncoding
		@see isEOF
	 */
	string readString( [in] sequence<char> Delimiters, [in] boolean bRemoveDelimiter ) 
			raises( com::sun::star::io::IOException ); 
 
	//------------------------------------------------------------------------- 
	/** Returns the EOF status.

		<p>This method has to be used to detect if the end
		of the stream is reached.</p> 
		<p><strong>Important:</strong>
		This cannot be detected by asking for an empty string
		because that can be a valid return value of <member>
		readLine()</member> (if the line is empty) and
		readString() (if a delimiter is directly followed
		by the next one).</p>
	
		@returns 
			<TRUE/>, if the end of file is reached, so that 
			no next string can be read. <FALSE/> otherwise
	 */
	boolean isEOF() 
			raises( com::sun::star::io::IOException ); 
 
	//------------------------------------------------------------------------- 
	/** sets character encoding.

		@param Encoding
			sets the character encoding that should be used.
			The character encoding names refer to the document
			http://www.iana.org/assignments/character-sets.
			Which character sets are supported depends on
			the implementation.
	 */
	void setEncoding( [in] string Encoding ); 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
