/**************************************************************
 *
 * 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_sd.hxx"
#include <com/sun/star/animations/XTimeContainer.hpp>
#include <com/sun/star/presentation/ParagraphTarget.hpp>
#include <com/sun/star/animations/AnimationFill.hpp>
#include <com/sun/star/animations/XAnimate.hpp>
#include <com/sun/star/animations/AnimationRestart.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/util/XCloneable.hpp>
#include <comphelper/processfactory.hxx>

#include <cppuhelper/implbase5.hxx>
#include <osl/mutex.hxx>
#include "CustomAnimationPreset.hxx"

using ::osl::Mutex;
using ::osl::Guard;
using ::rtl::OUString;

using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::XInterface;
using ::com::sun::star::lang::NoSupportException;
using ::com::sun::star::beans::NamedValue;
using ::com::sun::star::lang::IllegalArgumentException;
using ::com::sun::star::container::NoSuchElementException;
using ::com::sun::star::container::ElementExistException;
using ::com::sun::star::lang::WrappedTargetException;
using ::com::sun::star::container::XEnumeration;
using ::com::sun::star::container::XEnumerationAccess;
using ::com::sun::star::util::XCloneable;
using ::com::sun::star::lang::XServiceInfo;
using ::com::sun::star::lang::XInitialization;
using ::com::sun::star::uno::Type;
using ::com::sun::star::uno::XWeak;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::presentation::ParagraphTarget;
using ::com::sun::star::drawing::XShape;

using namespace ::com::sun::star::animations;
namespace sd
{

typedef ::cppu::WeakImplHelper5< XTimeContainer, XEnumerationAccess, XCloneable, XServiceInfo, XInitialization > RandomAnimationNodeBase;
class RandomAnimationNode : public RandomAnimationNodeBase
{
public:
	RandomAnimationNode( const RandomAnimationNode& rNode );
	RandomAnimationNode( sal_Int16 nPresetClass );
	RandomAnimationNode();

	void init( sal_Int16 nPresetClass );

	// XInitialization
    void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException);

    // XChild
    Reference< XInterface > SAL_CALL getParent(  ) throw (RuntimeException);
    void SAL_CALL setParent( const Reference< XInterface >& Parent ) throw (NoSupportException, RuntimeException);

    // XCloneable
    virtual Reference< XCloneable > SAL_CALL createClone() throw (RuntimeException);

	// XServiceInfo
    OUString SAL_CALL getImplementationName() throw();
    Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw();
    sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw();

    // XAnimationNode
    ::sal_Int16 SAL_CALL getType() throw (RuntimeException);
    Any SAL_CALL getBegin() throw (RuntimeException);
    void SAL_CALL setBegin( const Any& _begin ) throw (RuntimeException);
    Any SAL_CALL getDuration() throw (RuntimeException);
    void SAL_CALL setDuration( const Any& _duration ) throw (RuntimeException);
    Any SAL_CALL getEnd() throw (RuntimeException);
    void SAL_CALL setEnd( const Any& _end ) throw (RuntimeException);
    Any SAL_CALL getEndSync() throw (RuntimeException);
    void SAL_CALL setEndSync( const Any& _endsync ) throw (RuntimeException);
    Any SAL_CALL getRepeatCount() throw (RuntimeException);
    void SAL_CALL setRepeatCount( const Any& _repeatcount ) throw (RuntimeException);
    Any SAL_CALL getRepeatDuration() throw (RuntimeException);
    void SAL_CALL setRepeatDuration( const Any& _repeatduration ) throw (RuntimeException);
    ::sal_Int16 SAL_CALL getFill() throw (RuntimeException);
    void SAL_CALL setFill( ::sal_Int16 _fill ) throw (RuntimeException);
    ::sal_Int16 SAL_CALL getFillDefault() throw (RuntimeException);
    void SAL_CALL setFillDefault( ::sal_Int16 _filldefault ) throw (RuntimeException);
    ::sal_Int16 SAL_CALL getRestart() throw (RuntimeException);
    void SAL_CALL setRestart( ::sal_Int16 _restart ) throw (RuntimeException);
    ::sal_Int16 SAL_CALL getRestartDefault() throw (RuntimeException);
	void SAL_CALL setRestartDefault( ::sal_Int16 _restartdefault ) throw (RuntimeException);
    double SAL_CALL getAcceleration() throw (RuntimeException);
    void SAL_CALL setAcceleration( double _acceleration ) throw (RuntimeException);
    double SAL_CALL getDecelerate() throw (RuntimeException);
    void SAL_CALL setDecelerate( double _decelerate ) throw (RuntimeException);
    ::sal_Bool SAL_CALL getAutoReverse() throw (RuntimeException);
    void SAL_CALL setAutoReverse( ::sal_Bool _autoreverse ) throw (RuntimeException);
    Sequence< NamedValue > SAL_CALL getUserData() throw (RuntimeException);
    void SAL_CALL setUserData( const Sequence< NamedValue >& _userdata ) throw (RuntimeException);

	// XElementAccess
	virtual Type SAL_CALL getElementType() throw (RuntimeException);
	virtual sal_Bool SAL_CALL hasElements() throw (RuntimeException);

	// XEnumerationAccess
    virtual Reference< XEnumeration > SAL_CALL createEnumeration() throw (RuntimeException);

    // XTimeContainer
    Reference< XAnimationNode > SAL_CALL insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) throw (IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException);
    Reference< XAnimationNode > SAL_CALL insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) throw (IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException);
    Reference< XAnimationNode > SAL_CALL replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& oldChild ) throw (IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException);
    Reference< XAnimationNode > SAL_CALL removeChild( const Reference< XAnimationNode >& oldChild ) throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException);
    Reference< XAnimationNode > SAL_CALL appendChild( const Reference< XAnimationNode >& newChild ) throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException);

private:
	// our first, last and only protection from mutli-threads!
	Mutex maMutex;

	sal_Int16 mnPresetClass;
	Reference< XInterface > mxParent;

	Any maBegin, maDuration, maEnd, maEndSync, maRepeatCount, maRepeatDuration, maTarget;
	sal_Int16 mnFill, mnFillDefault, mnRestart, mnRestartDefault;
	double mfAcceleration, mfDecelerate;
	sal_Bool mbAutoReverse;
	Sequence< NamedValue > maUserData;

	Reference< XAnimate > mxFirstNode;
};

// --------------------------------------------------------------------

static const sal_Char* pSN1 = "com.sun.star.animations.ParallelTimeContainer";
static const sal_Char* pSN2 = "com.sun.star.comp.sd.RandomAnimationNode";

// --------------------------------------------------------------------

SD_DLLPUBLIC Reference< XInterface > RandomAnimationNode_createInstance( sal_Int16 nPresetClass )
{
	Reference< XInterface > xInt( static_cast<XWeak*>( new RandomAnimationNode( nPresetClass ) ) );
	return xInt;
}

// --------------------------------------------------------------------

Reference< XInterface > SAL_CALL RandomNode_createInstance( const Reference< XMultiServiceFactory > &  )
{
	Reference< XInterface > xInt( static_cast<XWeak*>( new RandomAnimationNode() ) );
	return xInt;
}

// --------------------------------------------------------------------

OUString RandomNode__getImplementationName() throw( RuntimeException )
{
	return OUString( RTL_CONSTASCII_USTRINGPARAM( "sd::RandomAnimationNode" ) );
}

// --------------------------------------------------------------------

Sequence< OUString > SAL_CALL RandomNode_getSupportedServiceNames() throw( RuntimeException )
{
//	static const OUString aSN1( OUString::createFromAscii( pSN1 ) );
	static const OUString aSN2( OUString::createFromAscii( pSN2 ) );
	Sequence< OUString > aSeq( &aSN2, 1 );
//	aSeq[0] = aSN1;
///	aSeq[1] = aSN2;
	return aSeq;
}

// --------------------------------------------------------------------

RandomAnimationNode::RandomAnimationNode( const RandomAnimationNode& rNode )
:	RandomAnimationNodeBase(),
	mnPresetClass( rNode.mnPresetClass ),
	maBegin( rNode.maBegin ),
	maDuration( rNode.maDuration ),
	maEnd( rNode.maEnd ),
	maEndSync( rNode.maEndSync ),
	maRepeatCount( rNode.maRepeatCount ),
	maRepeatDuration( rNode.maRepeatDuration ),
	maTarget( rNode.maTarget ),
	mnFill( rNode.mnFill ),
	mnFillDefault( rNode.mnFillDefault ),
	mnRestart( rNode.mnRestart ),
	mnRestartDefault( rNode.mnRestartDefault ),
	mfAcceleration( rNode.mfAcceleration ),
	mfDecelerate( rNode.mfDecelerate ),
	mbAutoReverse( rNode.mbAutoReverse ),
	maUserData( rNode.maUserData )
{
}

// --------------------------------------------------------------------

RandomAnimationNode::RandomAnimationNode( sal_Int16 nPresetClass )
{
	init( nPresetClass );
}

RandomAnimationNode::RandomAnimationNode()
{
	init( 1 );
}

void RandomAnimationNode::init( sal_Int16 nPresetClass )
{
	mnPresetClass = nPresetClass;
	mnFill = AnimationFill::DEFAULT;
	mnFillDefault = AnimationFill::INHERIT;
	mnRestart = AnimationRestart::DEFAULT;
	mnRestartDefault = AnimationRestart::INHERIT;
	mfAcceleration = 0.0;
	mfDecelerate = 0.0;
	mbAutoReverse = sal_False;
}

// --------------------------------------------------------------------

// XInitialization
void SAL_CALL RandomAnimationNode::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException)
{
	if( aArguments.getLength() != 1 )
		throw IllegalArgumentException();

	if( aArguments[0].getValueType() == ::getCppuType((const sal_Int16*)0) )
	{
		aArguments[0] >>= mnPresetClass;
	}
	else if( aArguments[0].getValueType() != ::getCppuType((const ParagraphTarget*)0) )
	{
		Reference< XShape > xShape;
		aArguments[0] >>= xShape;
		if( !xShape.is() )
			throw IllegalArgumentException();
	}
	maTarget = aArguments[0];
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Int16 SAL_CALL RandomAnimationNode::getType() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return ::com::sun::star::animations::AnimationNodeType::PAR;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getBegin() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maBegin;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setBegin( const Any& _begin ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maBegin = _begin;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getDuration() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maDuration;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setDuration( const Any& _duration ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maDuration = _duration;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getEnd() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maEnd;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setEnd( const Any& _end ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maEnd = _end;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getEndSync() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maEndSync;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setEndSync( const Any& _endsync ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maEndSync = _endsync;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getRepeatCount() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maRepeatCount;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setRepeatCount( const Any& _repeatcount ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maRepeatCount = _repeatcount;
}

// --------------------------------------------------------------------

// XAnimationNode
Any SAL_CALL RandomAnimationNode::getRepeatDuration() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maRepeatDuration;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setRepeatDuration( const Any& _repeatduration ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maRepeatDuration = _repeatduration;
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Int16 SAL_CALL RandomAnimationNode::getFill() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mnFill;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setFill( sal_Int16 _fill ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mnFill = _fill;
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Int16 SAL_CALL RandomAnimationNode::getFillDefault() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mnFillDefault;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setFillDefault( sal_Int16 _filldefault ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mnFillDefault = _filldefault;
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Int16 SAL_CALL RandomAnimationNode::getRestart() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mnRestart;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setRestart( sal_Int16 _restart ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mnRestart = _restart;
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Int16 SAL_CALL RandomAnimationNode::getRestartDefault() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mnRestartDefault;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setRestartDefault( sal_Int16 _restartdefault ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mnRestartDefault = _restartdefault;
}

// --------------------------------------------------------------------

// XAnimationNode
double SAL_CALL RandomAnimationNode::getAcceleration() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mfAcceleration;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setAcceleration( double _acceleration ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mfAcceleration = _acceleration;
}

// --------------------------------------------------------------------

// XAnimationNode
double SAL_CALL RandomAnimationNode::getDecelerate() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mfDecelerate;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setDecelerate( double _decelerate ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mfDecelerate = _decelerate;
}

// --------------------------------------------------------------------

// XAnimationNode
sal_Bool SAL_CALL RandomAnimationNode::getAutoReverse() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mbAutoReverse;
}

// --------------------------------------------------------------------

// XAnimationNode
void SAL_CALL RandomAnimationNode::setAutoReverse( sal_Bool _autoreverse ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mbAutoReverse = _autoreverse;
}

// --------------------------------------------------------------------

Sequence< NamedValue > SAL_CALL RandomAnimationNode::getUserData() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return maUserData;
}

// --------------------------------------------------------------------

void SAL_CALL RandomAnimationNode::setUserData( const Sequence< NamedValue >& _userdata ) throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	maUserData = _userdata;
}

// --------------------------------------------------------------------

// XChild
Reference< XInterface > SAL_CALL RandomAnimationNode::getParent() throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	return mxParent;
}

// --------------------------------------------------------------------

// XChild
void SAL_CALL RandomAnimationNode::setParent( const Reference< XInterface >& Parent ) throw (NoSupportException, RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );
	mxParent = Parent;
}

// --------------------------------------------------------------------

// XCloneable
Reference< XCloneable > SAL_CALL RandomAnimationNode::createClone() throw (RuntimeException)
{
	Reference< XCloneable > xNewNode( new RandomAnimationNode( *this ) );
	return xNewNode;
}

// --------------------------------------------------------------------

// XElementAccess
Type SAL_CALL RandomAnimationNode::getElementType() throw (RuntimeException)
{
	return ::getCppuType((const Reference< XAnimationNode >*)0);
}

// --------------------------------------------------------------------

// XElementAccess
sal_Bool SAL_CALL RandomAnimationNode::hasElements() throw (RuntimeException)
{
	return sal_True;
}

// --------------------------------------------------------------------

// XEnumerationAccess
Reference< XEnumeration > SAL_CALL RandomAnimationNode::createEnumeration()
	throw (RuntimeException)
{
	Guard< Mutex > aGuard( maMutex );

	if( !maTarget.hasValue() && mxFirstNode.is() )
	{
		Any aTarget( mxFirstNode->getTarget() );
		if( aTarget.hasValue() )
		{
			maTarget = aTarget;
			mxFirstNode.clear();
		}
	}

	Reference< XEnumeration > xEnum;

	Reference< XEnumerationAccess > aEnumAccess( CustomAnimationPresets::getCustomAnimationPresets().getRandomPreset( mnPresetClass ), UNO_QUERY );

	if( aEnumAccess.is() )
	{
		Reference< XEnumeration > xEnumeration( aEnumAccess->createEnumeration(), UNO_QUERY );
		if( xEnumeration.is() )
		{
			while( xEnumeration->hasMoreElements() )
			{
				Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
				if( xAnimate.is() )
					xAnimate->setTarget( maTarget );
			}
		}
		xEnum = aEnumAccess->createEnumeration();
	}
	else
	{
		// no presets? give empty node!
		Reference< XMultiServiceFactory > xServiceFactory( comphelper::getProcessServiceFactory() );
		Reference< XEnumerationAccess > aEmptyEnumAccess(
			xServiceFactory->createInstance(
				OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.animations.ParallelTimeContainer" ))),
			UNO_QUERY );

		if( aEmptyEnumAccess.is() )
			xEnum = aEmptyEnumAccess->createEnumeration();
	}

	return xEnum;
}

// --------------------------------------------------------------------


// XTimeContainer
Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >&  )
	throw (IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException)
{
	return appendChild( newChild );
}

// --------------------------------------------------------------------

// XTimeContainer
Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >&  )
	throw (IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException)
{
	return appendChild( newChild );
}

// --------------------------------------------------------------------

// XTimeContainer
Reference< XAnimationNode > SAL_CALL RandomAnimationNode::replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >&  )
	throw( IllegalArgumentException, NoSuchElementException, ElementExistException, WrappedTargetException, RuntimeException)
{
	return appendChild( newChild );
}

// --------------------------------------------------------------------

// XTimeContainer
Reference< XAnimationNode > SAL_CALL RandomAnimationNode::removeChild( const Reference< XAnimationNode >& oldChild )
	throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException)
{
	return oldChild;
}

// --------------------------------------------------------------------

// XTimeContainer
Reference< XAnimationNode > SAL_CALL RandomAnimationNode::appendChild( const Reference< XAnimationNode >& newChild )
	throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
{
	Reference< XAnimate > xAnimate( newChild, UNO_QUERY );
	if( xAnimate.is() )
	{
		Any aTarget( xAnimate->getTarget() );
		if( aTarget.hasValue() )
			maTarget = aTarget;
	}

	if( !maTarget.hasValue() && !mxFirstNode.is() )
		mxFirstNode = xAnimate;

	return newChild;
}

// XServiceInfo
OUString RandomAnimationNode::getImplementationName() throw()
{
	return RandomNode__getImplementationName();
}

// XServiceInfo
sal_Bool RandomAnimationNode::supportsService(const OUString& ServiceName) throw()
{
	return ServiceName.equalsAscii( pSN1 ) || ServiceName.equalsAscii( pSN2 );
}

// XServiceInfo
Sequence< OUString > RandomAnimationNode::getSupportedServiceNames(void) throw()
{
	return RandomNode_getSupportedServiceNames();
}

}
