/**************************************************************
 *
 * 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_CONNECTION_XACCEPTOR_IDL_
#define _COM_SUN_STAR_CONNECTION_XACCEPTOR_IDL_

#include <com/sun/star/connection/ConnectionSetupException.idl>
#include <com/sun/star/connection/AlreadyAcceptingException.idl>
#include <com/sun/star/lang/IllegalArgumentException.idl>
#include <com/sun/star/connection/XConnection.idl>


module com {  module sun {  module star {  module connection {

/** allows to passively accept connection attempts from other processes.

	<p>
	This is the counterpart to the XConnector interface.
 */
published interface XAcceptor: com::sun::star::uno::XInterface
{
	// DocMerge from xml: method com::sun::star::connection::XAcceptor::accept
	/** accepts an interprocess connection. Waits until someone connects to the resource.
	    <p>
        After a successful return, the method may be called again to accept
	    further connections, but the parameter string MUST be left unchanged.


	   @param sConnectionDescription
				contains the kind of the connection plus a
		      comma separated list of attributes,
			   e.g., <em>socket,host=localhost,port=2345</em> for a tcpip connection.

	   @return null reference,
			stopAccepting was called.
			Otherwise a valid XConnection reference.

	   @throws AlreadyAcceptingException
				Only one acceptor-thread per instance allowed.
	   @throws ConnectionSetupException
			Problems during setting up the acceptor.
	      (e.g., Security-reasons, socket already busy, etc.)
	   @throws com::sun::star::lang::IllegalArgumentException
	              sConnectionDescription could not be interpreted

	 */
	XConnection accept( [in] string sConnectionDescription )
		raises( AlreadyAcceptingException,
				ConnectionSetupException,
				com::sun::star::lang::IllegalArgumentException);


	/** pushes acceptor out of the accept-call.
	 */
	void stopAccepting();
};

};};};};

#endif
