/**************************************************************
 * 
 * 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_xmloff.hxx"

#include "sal/config.h"

#include "xmloff/dllapi.h"

#include <string.h>
#include <com/sun/star/container/XSet.hpp>
#include <com/sun/star/registry/XRegistryKey.hpp>
#include <osl/diagnose.h>
#include <tools/debug.hxx>

#include <cppuhelper/factory.hxx>
#include <uno/lbnames.h>
#include "xmloff/xmlreg.hxx"

using namespace rtl;
using namespace com::sun::star;

#define SERVICE( className )										\
extern OUString SAL_CALL className##_getImplementationName() throw();	\
extern uno::Sequence< OUString > SAL_CALL className##_getSupportedServiceNames() throw();\
extern uno::Reference< uno::XInterface > SAL_CALL className##_createInstance(			\
		const uno::Reference< lang::XMultiServiceFactory > & rSMgr )				\
	throw( uno::Exception )

// impress oasis import
SERVICE( XMLImpressImportOasis );
SERVICE( XMLImpressStylesImportOasis );
SERVICE( XMLImpressContentImportOasis );
SERVICE( XMLImpressMetaImportOasis );
SERVICE( XMLImpressSettingsImportOasis );

// impress oasis export
SERVICE( XMLImpressExportOasis );
SERVICE( XMLImpressStylesExportOasis );
SERVICE( XMLImpressContentExportOasis );
SERVICE( XMLImpressMetaExportOasis );
SERVICE( XMLImpressSettingsExportOasis );

// impress OOo import

// impress OOo export
SERVICE( XMLImpressExportOOO );
SERVICE( XMLImpressStylesExportOOO );
SERVICE( XMLImpressContentExportOOO );
SERVICE( XMLImpressMetaExportOOO );
SERVICE( XMLImpressSettingsExportOOO );

// draw oasis import
SERVICE( XMLDrawImportOasis );
SERVICE( XMLDrawStylesImportOasis );
SERVICE( XMLDrawContentImportOasis );
SERVICE( XMLDrawMetaImportOasis );
SERVICE( XMLDrawSettingsImportOasis );

// draw oasis export
SERVICE( XMLDrawExportOasis );
SERVICE( XMLDrawStylesExportOasis );
SERVICE( XMLDrawContentExportOasis );
SERVICE( XMLDrawMetaExportOasis );
SERVICE( XMLDrawSettingsExportOasis );

// draw OOo import

// draw OOo export
SERVICE( XMLDrawExportOOO );
SERVICE( XMLDrawStylesExportOOO );
SERVICE( XMLDrawContentExportOOO );
SERVICE( XMLDrawMetaExportOOO );
SERVICE( XMLDrawSettingsExportOOO );

// impress animation import
SERVICE( AnimationsImport );

// drawing layer export
SERVICE( XMLDrawingLayerExport );

// impress xml clipboard export
SERVICE( XMLImpressClipboardExport );

// chart oasis import
SERVICE( SchXMLImport );
SERVICE( SchXMLImport_Meta );
SERVICE( SchXMLImport_Styles );
SERVICE( SchXMLImport_Content );

// chart oasis export
SERVICE( SchXMLExport_Oasis );
SERVICE( SchXMLExport_Oasis_Meta );
SERVICE( SchXMLExport_Oasis_Styles );
SERVICE( SchXMLExport_Oasis_Content );

// chart OOo import

// chart OOo export
SERVICE( SchXMLExport );
SERVICE( SchXMLExport_Styles );
SERVICE( SchXMLExport_Content );

// version list import/export
SERVICE( XMLVersionListPersistence );

// meta export
SERVICE( XMLMetaExportComponent );

// meta import
SERVICE( XMLMetaImportComponent );

// meta export OOo
SERVICE( XMLMetaExportOOO );

// writer autotext event export
SERVICE( XMLAutoTextEventExport );

// writer autotext event import
SERVICE( XMLAutoTextEventImport );

// writer autotext event export OOo
SERVICE( XMLAutoTextEventExportOOO );

// writer autotext event import OOo
SERVICE( XMLAutoTextEventImportOOO );

// Oasis2OOo transformer
SERVICE( Oasis2OOoTransformer );

// OOo2Oasis transformer
SERVICE( OOo2OasisTransformer );

//
#ifdef __cplusplus
extern "C"
{
#endif

XMLOFF_DLLPUBLIC void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** )
{
	*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
}

#define SINGLEFACTORY(classname)\
		if( classname##_getImplementationName().equalsAsciiL( pImplName, nImplNameLen ) )\
		{\
			xFactory = ::cppu::createSingleFactory( xMSF,\
				classname##_getImplementationName(),\
				classname##_createInstance,\
				classname##_getSupportedServiceNames() );\
		}

XMLOFF_DLLPUBLIC void * SAL_CALL component_getFactory( const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ )
{
	void * pRet = 0;
	if( pServiceManager )
	{
		uno::Reference< lang::XMultiServiceFactory > xMSF( reinterpret_cast< lang::XMultiServiceFactory * >( pServiceManager ) );

		uno::Reference< lang::XSingleServiceFactory > xFactory;

		const sal_Int32 nImplNameLen = strlen( pImplName );

		// impress oasis import
		SINGLEFACTORY( XMLImpressImportOasis )
		else SINGLEFACTORY( XMLImpressStylesImportOasis )
		else SINGLEFACTORY( XMLImpressContentImportOasis )
		else SINGLEFACTORY( XMLImpressMetaImportOasis )
		else SINGLEFACTORY( XMLImpressSettingsImportOasis )

		// impress oasis export
		else SINGLEFACTORY( XMLImpressExportOasis )
		else SINGLEFACTORY( XMLImpressStylesExportOasis )
		else SINGLEFACTORY( XMLImpressContentExportOasis )
		else SINGLEFACTORY( XMLImpressMetaExportOasis )
		else SINGLEFACTORY( XMLImpressSettingsExportOasis )

		else SINGLEFACTORY( AnimationsImport )

		// impress OOo export
		else SINGLEFACTORY( XMLImpressExportOOO )
		else SINGLEFACTORY( XMLImpressStylesExportOOO )
		else SINGLEFACTORY( XMLImpressContentExportOOO )
		else SINGLEFACTORY( XMLImpressMetaExportOOO )
		else SINGLEFACTORY( XMLImpressSettingsExportOOO )

		// draw oasis import
		else SINGLEFACTORY( XMLDrawImportOasis )
		else SINGLEFACTORY( XMLDrawStylesImportOasis )
		else SINGLEFACTORY( XMLDrawContentImportOasis )
		else SINGLEFACTORY( XMLDrawMetaImportOasis )
		else SINGLEFACTORY( XMLDrawSettingsImportOasis )

		// draw oasis export
		else SINGLEFACTORY( XMLDrawExportOasis )
		else SINGLEFACTORY( XMLDrawStylesExportOasis )
		else SINGLEFACTORY( XMLDrawContentExportOasis )
		else SINGLEFACTORY( XMLDrawMetaExportOasis )
		else SINGLEFACTORY( XMLDrawSettingsExportOasis )

		// draw OOo export
		else SINGLEFACTORY( XMLDrawExportOOO )
		else SINGLEFACTORY( XMLDrawStylesExportOOO )
		else SINGLEFACTORY( XMLDrawContentExportOOO )
		else SINGLEFACTORY( XMLDrawMetaExportOOO )
		else SINGLEFACTORY( XMLDrawSettingsExportOOO )

		// drawing layer export
		else SINGLEFACTORY( XMLDrawingLayerExport )

		// impress xml clipboard export
		else SINGLEFACTORY( XMLImpressClipboardExport )

		// chart oasis import
		else SINGLEFACTORY( SchXMLImport )
		else SINGLEFACTORY( SchXMLImport_Meta )
		else SINGLEFACTORY( SchXMLImport_Styles )
		else SINGLEFACTORY( SchXMLImport_Content )

		// chart oasis export
		else SINGLEFACTORY( SchXMLExport_Oasis )
		else SINGLEFACTORY( SchXMLExport_Oasis_Meta )
		else SINGLEFACTORY( SchXMLExport_Oasis_Styles )
		else SINGLEFACTORY( SchXMLExport_Oasis_Content )

		// chart OOo export
		else SINGLEFACTORY( SchXMLExport )
		else SINGLEFACTORY( SchXMLExport_Styles )
		else SINGLEFACTORY( SchXMLExport_Content )

		// meta import/export
		else SINGLEFACTORY( XMLMetaExportComponent )
		else SINGLEFACTORY( XMLMetaImportComponent )

        else SINGLEFACTORY( XMLVersionListPersistence )

		// meta import/export OOo
		else SINGLEFACTORY( XMLMetaExportOOO )

		// auto text import/export
		else SINGLEFACTORY( XMLAutoTextEventExport )
		else SINGLEFACTORY( XMLAutoTextEventImport )
		else SINGLEFACTORY( XMLAutoTextEventExportOOO )

		if( xFactory.is())
		{
			xFactory->acquire();
			pRet = xFactory.get();
		}
	}
	return pRet;
}

#ifdef __cplusplus
}
#endif

