/**************************************************************
 *
 * 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.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_ucbhelper.hxx"

/**************************************************************************
								TODO
 **************************************************************************

 *************************************************************************/
#include <osl/mutex.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <ucbhelper/interactionrequest.hxx>

using namespace com::sun::star;
using namespace ucbhelper;

//=========================================================================
//=========================================================================
//
// InteractionRequest Implementation.
//
//=========================================================================
//=========================================================================

namespace ucbhelper
{

struct InteractionRequest_Impl
{
    rtl::Reference< InteractionContinuation > m_xSelection;
    com::sun::star::uno::Any m_aRequest;
    com::sun::star::uno::Sequence<
        com::sun::star::uno::Reference<
            com::sun::star::task::XInteractionContinuation > > m_aContinuations;

    InteractionRequest_Impl() {}
    InteractionRequest_Impl( const uno::Any & rRequest )
    : m_aRequest( rRequest ) {}
};

}

//=========================================================================
InteractionRequest::InteractionRequest()
: m_pImpl( new InteractionRequest_Impl )
{
}

//=========================================================================
InteractionRequest::InteractionRequest( const uno::Any & rRequest )
: m_pImpl( new InteractionRequest_Impl( rRequest ) )
{
}

//=========================================================================
// virtual
InteractionRequest::~InteractionRequest()
{
    delete m_pImpl;
}

//=========================================================================
void InteractionRequest::setRequest( const uno::Any & rRequest )
{
    m_pImpl->m_aRequest = rRequest;
}

//=========================================================================
void InteractionRequest::setContinuations(
                const uno::Sequence< uno::Reference<
                    task::XInteractionContinuation > > & rContinuations )
{
    m_pImpl->m_aContinuations = rContinuations;
}

//=========================================================================
rtl::Reference< InteractionContinuation >
InteractionRequest::getSelection() const
{
    return m_pImpl->m_xSelection;
}

//=========================================================================
void InteractionRequest::setSelection(
                const rtl::Reference< InteractionContinuation > & rxSelection )
{
    m_pImpl->m_xSelection = rxSelection;
}

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionRequest::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionRequest::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionRequest::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionRequest * >( this ) );

	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionRequest::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionRequest::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< task::XInteractionRequest > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionRequest methods.
//
//=========================================================================

// virtual
uno::Any SAL_CALL InteractionRequest::getRequest()
    throw( uno::RuntimeException )
{
    return m_pImpl->m_aRequest;
}

//=========================================================================
// virtual
uno::Sequence< uno::Reference< task::XInteractionContinuation > > SAL_CALL
InteractionRequest::getContinuations()
    throw( uno::RuntimeException )
{
    return m_pImpl->m_aContinuations;
}

//=========================================================================
//=========================================================================
//
// InteractionContinuation Implementation.
//
//=========================================================================
//=========================================================================

namespace ucbhelper
{

struct InteractionContinuation_Impl
{
    InteractionRequest * m_pRequest;

    InteractionContinuation_Impl( InteractionRequest * pRequest )
    : m_pRequest( pRequest ) {}
};

}

//=========================================================================
InteractionContinuation::InteractionContinuation(
                        InteractionRequest * pRequest )
: m_pImpl( new InteractionContinuation_Impl( pRequest ) )
{
}

//=========================================================================
// virtual
InteractionContinuation::~InteractionContinuation()
{
    delete m_pImpl;
}

//=========================================================================
void InteractionContinuation::recordSelection()
{
    m_pImpl->m_pRequest->setSelection( this );
}

//=========================================================================
//=========================================================================
//
// InteractionAbort Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionAbort::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionAbort::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionAbort::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< task::XInteractionAbort * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionAbort::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionAbort::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< task::XInteractionAbort > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionAbort::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//=========================================================================
//
// InteractionRetry Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionRetry::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionRetry::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionRetry::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< task::XInteractionRetry * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionRetry::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionRetry::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< task::XInteractionRetry > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionRetry::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//=========================================================================
//
// InteractionApprove Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionApprove::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionApprove::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionApprove::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< task::XInteractionApprove * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionApprove::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionApprove::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< task::XInteractionApprove > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionApprove::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//=========================================================================
//
// InteractionDisapprove Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionDisapprove::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionDisapprove::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionDisapprove::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< task::XInteractionDisapprove * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionDisapprove::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionDisapprove::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< task::XInteractionDisapprove > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionDisapprove::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//=========================================================================
//
// InteractionSupplyAuthentication Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionSupplyAuthentication::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionSupplyAuthentication::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionSupplyAuthentication::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
            static_cast< lang::XTypeProvider * >( this ),
            static_cast< task::XInteractionContinuation * >( this ),
		    static_cast< ucb::XInteractionSupplyAuthentication * >( this ),
			static_cast< ucb::XInteractionSupplyAuthentication2 * >( this ));

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL
InteractionSupplyAuthentication::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionSupplyAuthentication::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference<
                        ucb::XInteractionSupplyAuthentication2 > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionSupplyAuthentication::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//
// XInteractionSupplyAuthentication methods.
//
//=========================================================================

// virtual
sal_Bool SAL_CALL
InteractionSupplyAuthentication::canSetRealm()
    throw( uno::RuntimeException )
{
    return m_bCanSetRealm;
}

//=========================================================================
// virtual
void SAL_CALL
InteractionSupplyAuthentication::setRealm( const rtl::OUString& Realm )
    throw( uno::RuntimeException )
{
    OSL_ENSURE( m_bCanSetPassword,
        "InteractionSupplyAuthentication::setRealm - Not supported!" );

    if ( m_bCanSetRealm )
        m_aRealm = Realm;
}

//=========================================================================
// virtual
sal_Bool SAL_CALL
InteractionSupplyAuthentication::canSetUserName()
    throw( uno::RuntimeException )
{
    return m_bCanSetUserName;
}

//=========================================================================
// virtual
void SAL_CALL
InteractionSupplyAuthentication::setUserName( const rtl::OUString& UserName )
    throw( uno::RuntimeException )
{
    OSL_ENSURE( m_bCanSetUserName,
        "InteractionSupplyAuthentication::setUserName - Not supported!" );

    if ( m_bCanSetUserName )
        m_aUserName = UserName;
}

//=========================================================================
// virtual
sal_Bool SAL_CALL
InteractionSupplyAuthentication::canSetPassword()
    throw( uno::RuntimeException )
{
    return m_bCanSetPassword;
}

//=========================================================================
// virtual
void SAL_CALL
InteractionSupplyAuthentication::setPassword( const rtl::OUString& Password )
    throw( uno::RuntimeException )
{
    OSL_ENSURE( m_bCanSetPassword,
        "InteractionSupplyAuthentication::setPassword - Not supported!" );

    if ( m_bCanSetPassword )
        m_aPassword = Password;
}

//=========================================================================
// virtual
uno::Sequence< ucb::RememberAuthentication > SAL_CALL
InteractionSupplyAuthentication::getRememberPasswordModes(
                                    ucb::RememberAuthentication& Default )
    throw( uno::RuntimeException )
{
    Default = m_eDefaultRememberPasswordMode;
    return m_aRememberPasswordModes;
}

//=========================================================================
// virtual
void SAL_CALL
InteractionSupplyAuthentication::setRememberPassword(
                                    ucb::RememberAuthentication Remember )
    throw( uno::RuntimeException )
{
    m_eRememberPasswordMode = Remember;
}

//=========================================================================
// virtual
sal_Bool SAL_CALL
InteractionSupplyAuthentication::canSetAccount()
    throw( uno::RuntimeException )
{
    return m_bCanSetAccount;
}

//=========================================================================
// virtual
void SAL_CALL
InteractionSupplyAuthentication::setAccount( const rtl::OUString& Account )
    throw( uno::RuntimeException )
{
    OSL_ENSURE( m_bCanSetAccount,
        "InteractionSupplyAuthentication::setAccount - Not supported!" );

    if ( m_bCanSetAccount )
        m_aAccount = Account;
}

//=========================================================================
// virtual
uno::Sequence< ucb::RememberAuthentication > SAL_CALL
InteractionSupplyAuthentication::getRememberAccountModes(
                                    ucb::RememberAuthentication& Default )
    throw( uno::RuntimeException )
{
    Default = m_eDefaultRememberAccountMode;
    return m_aRememberAccountModes;
}

//=========================================================================
// virtual
void SAL_CALL InteractionSupplyAuthentication::setRememberAccount(
                                    ucb::RememberAuthentication Remember )
    throw( uno::RuntimeException )
{
    m_eRememberAccountMode = Remember;
}

//=========================================================================
//
// XInteractionSupplyAuthentication2 methods.
//
//=========================================================================

// virtual
::sal_Bool SAL_CALL
InteractionSupplyAuthentication::canUseSystemCredentials(
        ::sal_Bool& Default )
	throw ( uno::RuntimeException )
{
    Default = m_bDefaultUseSystemCredentials;
    return m_bCanUseSystemCredentials;
}

//=========================================================================
// virtual
void SAL_CALL InteractionSupplyAuthentication::setUseSystemCredentials(
	    ::sal_Bool UseSystemCredentials )
	throw ( uno::RuntimeException )
{
	if ( m_bCanUseSystemCredentials )
		m_bUseSystemCredentials = UseSystemCredentials;
}


//=========================================================================
//=========================================================================
//
// InteractionSupplyName Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionSupplyName::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionSupplyName::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionSupplyName::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< ucb::XInteractionSupplyName * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL InteractionSupplyName::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionSupplyName::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference< ucb::XInteractionSupplyName > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionSupplyName::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}

//=========================================================================
//
// XInteractionSupplyName methods.
//
//=========================================================================

// virtual
void SAL_CALL
InteractionSupplyName::setName( const rtl::OUString& Name )
    throw( uno::RuntimeException )
{
    m_aName = Name;
}

//=========================================================================
//=========================================================================
//
// InteractionReplaceExistingData Implementation.
//
//=========================================================================
//=========================================================================

//=========================================================================
//
// XInterface methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionReplaceExistingData::acquire()
    throw()
{
	OWeakObject::acquire();
}

//=========================================================================
// virtual
void SAL_CALL InteractionReplaceExistingData::release()
    throw()
{
	OWeakObject::release();
}

//=========================================================================
// virtual
uno::Any SAL_CALL
InteractionReplaceExistingData::queryInterface( const uno::Type & rType )
    throw ( uno::RuntimeException )
{
    uno::Any aRet = cppu::queryInterface( rType,
                static_cast< lang::XTypeProvider * >( this ),
                static_cast< task::XInteractionContinuation * >( this ),
                static_cast< ucb::XInteractionReplaceExistingData * >( this ) );

    return aRet.hasValue()
            ? aRet : InteractionContinuation::queryInterface( rType );
}

//=========================================================================
//
// XTypeProvider methods.
//
//=========================================================================

// virtual
uno::Sequence< sal_Int8 > SAL_CALL
InteractionReplaceExistingData::getImplementationId()
    throw( uno::RuntimeException )
{
	static cppu::OImplementationId* pId = NULL;
  	if ( !pId )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
	  	if ( !pId )
	  	{
		  	static cppu::OImplementationId id( sal_False );
		  	pId = &id;
	  	}
  	}
  	return (*pId).getImplementationId();
}

//=========================================================================
// virtual
uno::Sequence< uno::Type > SAL_CALL InteractionReplaceExistingData::getTypes()
    throw( uno::RuntimeException )
{
    static cppu::OTypeCollection* pCollection = 0;
  	if ( !pCollection )
  	{
		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
		if ( !pCollection )
		{
			static cppu::OTypeCollection collection(
                getCppuType( static_cast<
                    uno::Reference< lang::XTypeProvider > * >( 0 ) ),
                getCppuType( static_cast<
                    uno::Reference<
                        ucb::XInteractionReplaceExistingData > * >( 0 ) ) );
			pCollection = &collection;
		}
	}
	return (*pCollection).getTypes();
}

//=========================================================================
//
// XInteractionContinuation methods.
//
//=========================================================================

// virtual
void SAL_CALL InteractionReplaceExistingData::select()
    throw( uno::RuntimeException )
{
    recordSelection();
}
