/**************************************************************
 * 
 * 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_XCommandProcessor_idl__
#define __com_sun_star_ucb_XCommandProcessor_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandEnvironment_idl__
#include <com/sun/star/ucb/XCommandEnvironment.idl>
#endif

#ifndef __com_sun_star_ucb_Command_idl__
#include <com/sun/star/ucb/Command.idl>
#endif

#ifndef __com_sun_star_ucb_CommandAbortedException_idl__
#include <com/sun/star/ucb/CommandAbortedException.idl>
#endif

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

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

//=============================================================================
/** defines a processor for synchronous commands, which are executed in a
    specific execution environment.

	@version  1.0
	@author   Kai Sommerfeld

    @see com::sun::star::ucb::XCommandProcessor2
    for the improved version of this interface.

	@see	  Command
	@see      XCommandEnvironment
	@see      XContent
*/
published interface XCommandProcessor : com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** creates a unique identifier for a command.

	    <p>This identifier can be used to abort the execution of the command
		accociated with that identifier. Note that it is generally not
		necessary to obtain a new id for each command, because commands are
		executed synchronously. So the id for a command is valid again after a
		command previously associated with this id has finished. In fact you
		only should get one identifier per thread and assign it to every
		command executed by that thread.</p>

        <p>Also, after a call to <member>XCommandProcessor::abort</member>, an
        identifier should not be used any longer (and instead be released by a
        call to <member>XCommandProcessor2::releaseCommandIdentifier</member>),
		because it may well abort <em>all</em> further calls to
        <member>XCommandProcessor::execute</member>.</p>

        <p>To avoid ever-increasing resource consumption, the identifier
        should be released via
        <member>XCommandProcessor2::releaseCommandIdentifier</member>
        when it is no longer used.</p>

		@returns
		a command identifier.
	*/
	long createCommandIdentifier();

	//-------------------------------------------------------------------------
	/** executes a command.

		<p>Common command definitions can be found in the soecification of the
		service	<type>Content</type>.

		@param aCommand
		is the command to execute.

		@param CommandId
		is a unique id for the command. This identifier was obtained by calling
		<member>XCommandProcessor::createCommandIdentifier</member>. A value of
        zero can be used, if the command never shall be aborted. Different
        threads MUST NOT share one command identifier (except <code>0</code>).
        This can easily achieved, if every thread that wants to use an
        <type>XCommandProcessor</type>, obtains exactly one identifier
        using <member>XCommandProcessor::createCommandIdentifier</member>.
        This identifier can be used for every call to
        <member>XCommandProcessor::execute</member> done by that thread.

		@param Environment
		is the execution environment.

		@returns
		the result according to the specification of the command.

		@throws CommandAbortedException
		to indicate that the command was aborted.

        @throws DuplicateCommandIdentifierException
        to indicate that two threads tried to use the same command identifier

		@throws Exception
		if an error occured during the execution of the command.
	*/
	any execute( [in] Command aCommand,
				 [in] long CommandId,
				 [in] XCommandEnvironment Environment )
		raises ( com::sun::star::uno::Exception, CommandAbortedException );

	//-------------------------------------------------------------------------
	/** ends the command associated with the given id.

        <p>Not every command can be aborted. It's up to the implementation
        to decide whether this method will actually end the processing of
        the command or simply do nothing.

		@param CommandId
		is a unique id for the command to abort. This must be the identifier
		passed to <member>XCommandProcessor::execute</member> for the command
		to abort.
	*/
	[oneway] void abort( [in] long CommandId );
};

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

}; }; }; };

#endif