/**************************************************************
 * 
 * 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_ucb_ContentResultSet_idl__
#define __com_sun_star_ucb_ContentResultSet_idl__

#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif

#ifndef __com_sun_star_sdbc_XResultSet_idl__
#include <com/sun/star/sdbc/XResultSet.idl>
#endif

#ifndef __com_sun_star_sdbc_XResultSetMetaDataSupplier_idl__
#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.idl>
#endif

#ifndef __com_sun_star_sdbc_XRow_idl__
#include <com/sun/star/sdbc/XRow.idl>
#endif

#ifndef __com_sun_star_sdbc_XCloseable_idl__
#include <com/sun/star/sdbc/XCloseable.idl>
#endif

#ifndef __com_sun_star_ucb_XContentAccess_idl__
#include <com/sun/star/ucb/XContentAccess.idl>
#endif

#ifndef __com_sun_star_sdbc_ResultSet_idl__
#include <com/sun/star/sdbc/ResultSet.idl>
#endif

//=============================================================================

module com { module sun { module star { module ucb {

//=============================================================================
/** provides access to the children of a folder content.

    <p>It can be understand as a table containing a row for	each child. The
	table columns may contain values of properties of the children.
*/
published service ContentResultSet
{
	//-------------------------------------------------------------------------
	/** must be implemented to make it possible to resolve cyclic object
	    references ( i.e. between an implementation of
		<type scope="com::sun::star::beans">XPropertySet</type>
		- which may	hold property change listeners - and
		<type scope="com::sun::star::beans">XPropertyChangeListener</type>
		- which may hold the property set ).

		<p>This interface is required.
	 */
	interface com::sun::star::lang::XComponent;

	/** provides access to the result set meta data. Meta data are for
	    example the number of columns of the result set, information
		on the data types of columns, column names, and more.

		<p>This interface is required.
	 */
	interface com::sun::star::sdbc::XResultSetMetaDataSupplier;

	//-------------------------------------------------------------------------
	/** enables travelling through the result set members ( the contents ).
		This interface mainly provides a cursor for the result set.

		<p>Note that every method of this interface implementation additionally
		may throw a	<type>ResultSetException</type> ( which is derived from
		<type scope="com::sun::star::sdbc">SQLException</type> to be compatible
		to that interface ). The new exception transports another exception,
		which indicates the reason for the failure of the method call.

		<p>This interface is required.
	 */
	interface com::sun::star::sdbc::XResultSet;

	//-------------------------------------------------------------------------
	/**	provides access to data of the content the cursor is pointing to.

		<p>Note that every method of this interface implementation additionally
		may throw a	<type>ResultSetException</type> ( which is derived from
		<type scope="com::sun::star::sdbc">SQLException</type> to be compatible
		to that interface ). The new exception transports another exception,
		which indicates the reason for the failure of the method call.

		<p>This interface is required.
	 */
	interface com::sun::star::sdbc::XRow;

	//-------------------------------------------------------------------------
	/** makes it possible to abort running activities ( i.e. to cancel
	    retrieving data from a server ).

		<p>Note that every method of this interface implementation additionally
		may throw a	<type>ResultSetException</type> ( which is derived from
		<type scope="com::sun::star::sdbc">SQLException</type> to be compatible
		to that interface ). The new exception transports another exception,
		which indicates the reason for the failure of the method call.

		<p>This interface is required.
	 */
	interface com::sun::star::sdbc::XCloseable;

	//-------------------------------------------------------------------------
	/** holds properties of the resultset.

		<p>This interface is required.
	 */
	interface com::sun::star::beans::XPropertySet;

	//-------------------------------------------------------------------------
	/** controls the travel mode of the resultset cursor.

		<p>There are two possible travel modes:

		<p><table border=1>
		<tr><td><member>CursorTravelMode::BLOCKING</member></td>
			<td>Each travel method of the resultset will not return until the
			    data for the new position were retrieved.</td></tr>
		<tr><td><member>CursorTravelMode::NONBLOCKING</member></td>
			<td>The implementation will throw a
				<code>CursorWouldBlockException</code>, if the data for the new
				position are not retrieved yet.</td></tr>
		</table>

		<p>The following pseudo-code illustrates the usage of a non-blocking
		cursor:

		<p><pre>
    	bProcessedAllRows = false
    	while ( !bProcessedAllRows )
    	{
        	cursor.setPropertyValue( "CursorTravelMode", BLOCKING )

        	cursor.travelSomeWhere()
        	collectRowData()

        	cursor.setPropertyValue( "CursorTravelMode", NONBLOCKING )

        	bGoOn = true;
        	while ( bGoOn )
        	{
            	try
            	{
                	cursor.travelSomeWhere()
                	collectRowData()
            	}
            	catch ( CursorWouldBlockException )
            	{
                	// No more data at the moment.
               	bGoOn = false
            	}
        	}

        	doSomethingWithCollectedRowData()

        	bProcessedAllRows = ...
    	}
		</pre>

		<p>
	 	If this property is not supported, the implementation needs to provide
		a blocking cursor.
		</p>

		<p>
		The implementation initially needs to set the value of this property
		to <member>CursorTravelMode::BLOCKING</member>.
		</p>

		@see CursorTravelMode
	 */
	[optional, property] long CursorTravelMode;

	/** contains the number of rows obtained (so far) from the data source. */
	[readonly, property] long RowCount;

	/** indicates that all rows of te resultset have been obtained. */
	[readonly, property] boolean IsRowCountFinal;

	//-------------------------------------------------------------------------
	/**	provides access to the content identifier and the content object
		itself.

		<p>This interface is required.
	 */
	interface XContentAccess;

	//-------------------------------------------------------------------------
	/** can be implemented to provide a complete JDBC conform result set
		interface for the implementation of this service.

		<p>The implememtation of this service is optional.
	 */
	service com::sun::star::sdbc::ResultSet;
};

//=============================================================================

}; }; }; };

#endif
