/**************************************************************
 * 
 * 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_forms.hxx"
#include "services.hxx"
#include "frm_module.hxx"
#include <cppuhelper/factory.hxx>
#include <uno/lbnames.h>
#include <osl/diagnose.h>
#include <uno/mapping.hxx>

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::registry;

//---------------------------------------------------------------------------------------
//.......................................................................................
#define DECLARE_SERVICE_INFO(classImplName) \
	namespace frm { \
		extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> SAL_CALL classImplName##_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory) throw (::com::sun::star::uno::RuntimeException); \
	}

//---------------------------------------------------------------------------------------
DECLARE_SERVICE_INFO(OFixedTextModel)
DECLARE_SERVICE_INFO(ORadioButtonModel)
DECLARE_SERVICE_INFO(ORadioButtonControl)
DECLARE_SERVICE_INFO(OCheckBoxModel)
DECLARE_SERVICE_INFO(OCheckBoxControl)
DECLARE_SERVICE_INFO(OHiddenModel)
DECLARE_SERVICE_INFO(OGroupBoxModel)
DECLARE_SERVICE_INFO(OGroupBoxControl)
DECLARE_SERVICE_INFO(OListBoxControl)
DECLARE_SERVICE_INFO(OListBoxModel)
DECLARE_SERVICE_INFO(OComboBoxControl)
DECLARE_SERVICE_INFO(OComboBoxModel)
DECLARE_SERVICE_INFO(OEditControl)
DECLARE_SERVICE_INFO(OEditModel)
DECLARE_SERVICE_INFO(ONumericControl)
DECLARE_SERVICE_INFO(ONumericModel)
DECLARE_SERVICE_INFO(OPatternControl)
DECLARE_SERVICE_INFO(OPatternModel)
DECLARE_SERVICE_INFO(OCurrencyControl)
DECLARE_SERVICE_INFO(OCurrencyModel)
DECLARE_SERVICE_INFO(ODateControl)
DECLARE_SERVICE_INFO(ODateModel)
DECLARE_SERVICE_INFO(OTimeControl)
DECLARE_SERVICE_INFO(OTimeModel)
DECLARE_SERVICE_INFO(OFormattedControl)
DECLARE_SERVICE_INFO(OFormattedModel)
DECLARE_SERVICE_INFO(OFileControlModel)
DECLARE_SERVICE_INFO(OButtonControl)
DECLARE_SERVICE_INFO(OButtonModel)
DECLARE_SERVICE_INFO(OImageButtonControl)
DECLARE_SERVICE_INFO(OImageButtonModel)

DECLARE_SERVICE_INFO(OImageControlControl)
DECLARE_SERVICE_INFO(OImageControlModel)
DECLARE_SERVICE_INFO(OGridControlModel)

// XForms objects
DECLARE_SERVICE_INFO(Binding)
DECLARE_SERVICE_INFO(Model)
DECLARE_SERVICE_INFO(XForms)

// some special handling for the FormattedFieldWrapper which can act as FormattedModel or as EditModel
DECLARE_SERVICE_INFO(OFormattedFieldWrapper)
	// this is for a service, which is instantiated through the EditModel service name
	// and which acts mostly as Edit (mostly means : if somebody uses XPersistObject::read immediately after
	// the object was instantiated and the stream contains a FormattedModel, it switches permanently to
	// formatted.)
namespace frm { \
	extern Reference< XInterface > SAL_CALL OFormattedFieldWrapper_CreateInstance_ForceFormatted(const Reference<XMultiServiceFactory>& _rxFactory) throw (RuntimeException); \
}

DECLARE_SERVICE_INFO(OFormsCollection)
DECLARE_SERVICE_INFO(ImageProducer)

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

static Sequence< ::rtl::OUString >						s_aClassImplementationNames;
static Sequence<Sequence< ::rtl::OUString > >	s_aClassServiceNames;
static Sequence<sal_Int64>								s_aFactories;
	// need to use sal_Int64 instead of ComponentInstantiation, as ComponentInstantiation has no cppuType, so
	// it can't be used with sequences

//---------------------------------------------------------------------------------------
void registerClassInfo(
		::rtl::OUString _rClassImplName,								// the ImplName of the class
		const Sequence< ::rtl::OUString >& _rServiceNames,		// the services supported by this class
		::cppu::ComponentInstantiation _pCreateFunction					// the method for instantiating such a class
		)
{
	sal_Int32 nCurrentLength = s_aClassImplementationNames.getLength();
	OSL_ENSURE((nCurrentLength == s_aClassServiceNames.getLength())
		&& (nCurrentLength == s_aFactories.getLength()),
		"forms::registerClassInfo : invalid class infos !");

	s_aClassImplementationNames.realloc(nCurrentLength + 1);
	s_aClassServiceNames.realloc(nCurrentLength + 1);
	s_aFactories.realloc(nCurrentLength + 1);

	s_aClassImplementationNames.getArray()[nCurrentLength] = _rClassImplName;
	s_aClassServiceNames.getArray()[nCurrentLength] = _rServiceNames;
	s_aFactories.getArray()[nCurrentLength] = reinterpret_cast<sal_Int64>(_pCreateFunction);
}

//---------------------------------------------------------------------------------------
//.......................................................................................
#define REGISTER_CLASS_CORE(classImplName) \
	registerClassInfo( \
		::rtl::OUString::createFromAscii("com.sun.star.form.") + ::rtl::OUString::createFromAscii(#classImplName), \
		aServices, \
		frm::classImplName##_CreateInstance)

//.......................................................................................
#define REGISTER_CLASS1(classImplName, service1) \
	aServices.realloc(1); \
	aServices.getArray()[0] = frm::service1; \
	REGISTER_CLASS_CORE(classImplName)

//.......................................................................................
#define REGISTER_CLASS2(classImplName, service1, service2) \
	aServices.realloc(2); \
	aServices.getArray()[0] = frm::service1; \
	aServices.getArray()[1] = frm::service2; \
	REGISTER_CLASS_CORE(classImplName)

//.......................................................................................
#define REGISTER_CLASS3(classImplName, service1, service2, service3) \
	aServices.realloc(3); \
	aServices.getArray()[0] = frm::service1; \
	aServices.getArray()[1] = frm::service2; \
	aServices.getArray()[2] = frm::service3; \
	REGISTER_CLASS_CORE(classImplName)

//.......................................................................................
#define REGISTER_CLASS4(classImplName, service1, service2, service3, service4) \
	aServices.realloc(4); \
	aServices.getArray()[0] = frm::service1; \
	aServices.getArray()[1] = frm::service2; \
	aServices.getArray()[2] = frm::service3; \
	aServices.getArray()[3] = frm::service4; \
	REGISTER_CLASS_CORE(classImplName)

//---------------------------------------------------------------------------------------
void ensureClassInfos()
{
	if (s_aClassImplementationNames.getLength())
		// nothing to do
		return;
	Sequence< ::rtl::OUString > aServices;

	// ========================================================================
	// = ControlModels
	// ------------------------------------------------------------------------
	// - FixedText
	REGISTER_CLASS2(OFixedTextModel, FRM_COMPONENT_FIXEDTEXT, FRM_SUN_COMPONENT_FIXEDTEXT);
	// - Hidden
	REGISTER_CLASS3(OHiddenModel, FRM_COMPONENT_HIDDENCONTROL, FRM_SUN_COMPONENT_HIDDENCONTROL, FRM_COMPONENT_HIDDEN);
	// - FileControl
	REGISTER_CLASS2(OFileControlModel, FRM_COMPONENT_FILECONTROL, FRM_SUN_COMPONENT_FILECONTROL);
	// - ImageButton
	REGISTER_CLASS2(OImageButtonModel, FRM_COMPONENT_IMAGEBUTTON, FRM_SUN_COMPONENT_IMAGEBUTTON);
	// - GridControl
	REGISTER_CLASS3(OGridControlModel, FRM_COMPONENT_GRID /* compatibility */, FRM_COMPONENT_GRIDCONTROL, FRM_SUN_COMPONENT_GRIDCONTROL);
	// - GroupBox
	REGISTER_CLASS2(OGroupBoxModel, FRM_COMPONENT_GROUPBOX, FRM_SUN_COMPONENT_GROUPBOX);

	// - RadioButton
	REGISTER_CLASS4( ORadioButtonModel, FRM_COMPONENT_RADIOBUTTON, FRM_SUN_COMPONENT_RADIOBUTTON, FRM_SUN_COMPONENT_DATABASE_RADIOBUTTON, BINDABLE_DATABASE_RADIO_BUTTON );
	// - CheckBox
	REGISTER_CLASS4( OCheckBoxModel, FRM_COMPONENT_CHECKBOX, FRM_SUN_COMPONENT_CHECKBOX, FRM_SUN_COMPONENT_DATABASE_CHECKBOX, BINDABLE_DATABASE_CHECK_BOX );
	// - ListBox
	REGISTER_CLASS4( OListBoxModel, FRM_COMPONENT_LISTBOX, FRM_SUN_COMPONENT_LISTBOX, FRM_SUN_COMPONENT_DATABASE_LISTBOX, BINDABLE_DATABASE_LIST_BOX );
	// - ComboBox
	REGISTER_CLASS4( OComboBoxModel, FRM_COMPONENT_COMBOBOX, FRM_SUN_COMPONENT_COMBOBOX, FRM_SUN_COMPONENT_DATABASE_COMBOBOX, BINDABLE_DATABASE_COMBO_BOX );
	// - EditControl
	REGISTER_CLASS4( OEditModel, FRM_COMPONENT_TEXTFIELD, FRM_SUN_COMPONENT_TEXTFIELD, FRM_SUN_COMPONENT_DATABASE_TEXTFIELD, BINDABLE_DATABASE_TEXT_FIELD );
	// - DateControl
	REGISTER_CLASS3( ODateModel, FRM_COMPONENT_DATEFIELD, FRM_SUN_COMPONENT_DATEFIELD, FRM_SUN_COMPONENT_DATABASE_DATEFIELD );
	// - TimeControl
	REGISTER_CLASS3( OTimeModel, FRM_COMPONENT_TIMEFIELD, FRM_SUN_COMPONENT_TIMEFIELD, FRM_SUN_COMPONENT_DATABASE_TIMEFIELD );
	// - NumericField
	REGISTER_CLASS4( ONumericModel, FRM_COMPONENT_NUMERICFIELD, FRM_SUN_COMPONENT_NUMERICFIELD, FRM_SUN_COMPONENT_DATABASE_NUMERICFIELD, BINDABLE_DATABASE_NUMERIC_FIELD );
	// - CurrencyField
	REGISTER_CLASS3( OCurrencyModel, FRM_COMPONENT_CURRENCYFIELD, FRM_SUN_COMPONENT_CURRENCYFIELD, FRM_SUN_COMPONENT_DATABASE_CURRENCYFIELD );
	// - PatternField
	REGISTER_CLASS3( OPatternModel, FRM_COMPONENT_PATTERNFIELD, FRM_SUN_COMPONENT_PATTERNFIELD, FRM_SUN_COMPONENT_DATABASE_PATTERNFIELD );
	// - Button
	REGISTER_CLASS2( OButtonModel, FRM_COMPONENT_COMMANDBUTTON, FRM_SUN_COMPONENT_COMMANDBUTTON );
	// - ImageControl
	REGISTER_CLASS2( OImageControlModel, FRM_COMPONENT_IMAGECONTROL, FRM_SUN_COMPONENT_IMAGECONTROL );

	// - FormattedField
	REGISTER_CLASS1(OFormattedFieldWrapper, FRM_COMPONENT_EDIT);
		// since SRC568 both OFormattedModel and OEditModel use FRM_COMPONENT_EDIT for persistence,
		// and while reading a wrapper determines which kind of model it is
	// register the wrapper for the FormattedField, as it handles the XPersistObject::write
	// so that version <= 5.1 are able to read it
	aServices.realloc(4);
	aServices.getArray()[0] = frm::FRM_COMPONENT_FORMATTEDFIELD;
	aServices.getArray()[1] = frm::FRM_SUN_COMPONENT_FORMATTEDFIELD;
    aServices.getArray()[2] = frm::FRM_SUN_COMPONENT_DATABASE_FORMATTEDFIELD;
	aServices.getArray()[3] = frm::BINDABLE_DATABASE_FORMATTED_FIELD;

	registerClassInfo(::rtl::OUString::createFromAscii("com.sun.star.comp.forms.OFormattedFieldWrapper_ForcedFormatted"),
		aServices,
		frm::OFormattedFieldWrapper_CreateInstance_ForceFormatted);

	// ========================================================================
	// = Controls
	// - RadioButton
	REGISTER_CLASS2(ORadioButtonControl, STARDIV_ONE_FORM_CONTROL_RADIOBUTTON, FRM_SUN_CONTROL_RADIOBUTTON);
	// - CheckBox
	REGISTER_CLASS2(OCheckBoxControl, STARDIV_ONE_FORM_CONTROL_CHECKBOX, FRM_SUN_CONTROL_CHECKBOX);
	// - GroupBox
	REGISTER_CLASS2(OGroupBoxControl, STARDIV_ONE_FORM_CONTROL_GROUPBOX, FRM_SUN_CONTROL_GROUPBOX);
	// - ListBox
	REGISTER_CLASS2(OListBoxControl, STARDIV_ONE_FORM_CONTROL_LISTBOX, FRM_SUN_CONTROL_LISTBOX);
	// - ComboBox
	REGISTER_CLASS2(OComboBoxControl, STARDIV_ONE_FORM_CONTROL_COMBOBOX, FRM_SUN_CONTROL_COMBOBOX);
	// - EditControl
	REGISTER_CLASS3(OEditControl, STARDIV_ONE_FORM_CONTROL_TEXTFIELD, FRM_SUN_CONTROL_TEXTFIELD, STARDIV_ONE_FORM_CONTROL_EDIT);
	// - DateControl
	REGISTER_CLASS2(ODateControl, STARDIV_ONE_FORM_CONTROL_DATEFIELD, FRM_SUN_CONTROL_DATEFIELD);
	// - TimeControl
	REGISTER_CLASS2(OTimeControl, STARDIV_ONE_FORM_CONTROL_TIMEFIELD, FRM_SUN_CONTROL_TIMEFIELD);
	// - NumericField
	REGISTER_CLASS2(ONumericControl, STARDIV_ONE_FORM_CONTROL_NUMERICFIELD, FRM_SUN_CONTROL_NUMERICFIELD);
	// - CurrencyField
	REGISTER_CLASS2(OCurrencyControl, STARDIV_ONE_FORM_CONTROL_CURRENCYFIELD, FRM_SUN_CONTROL_CURRENCYFIELD);
	// - PatternField
	REGISTER_CLASS2(OPatternControl, STARDIV_ONE_FORM_CONTROL_PATTERNFIELD, FRM_SUN_CONTROL_PATTERNFIELD);
	// - FormattedField
	REGISTER_CLASS2(OFormattedControl, STARDIV_ONE_FORM_CONTROL_FORMATTEDFIELD, FRM_SUN_CONTROL_FORMATTEDFIELD);
	// - Button
	REGISTER_CLASS2(OButtonControl, STARDIV_ONE_FORM_CONTROL_COMMANDBUTTON, FRM_SUN_CONTROL_COMMANDBUTTON);
	// - ImageButton
	REGISTER_CLASS2(OImageButtonControl, STARDIV_ONE_FORM_CONTROL_IMAGEBUTTON, FRM_SUN_CONTROL_IMAGEBUTTON);
	// - ImageControl
	REGISTER_CLASS2(OImageControlControl, STARDIV_ONE_FORM_CONTROL_IMAGECONTROL, FRM_SUN_CONTROL_IMAGECONTROL);


	// ========================================================================
	// = various
	REGISTER_CLASS1(OFormsCollection, FRM_SUN_FORMS_COLLECTION);
	REGISTER_CLASS1(ImageProducer, SRV_AWT_IMAGEPRODUCER);

	// ========================================================================
	// = XForms core
#define REGISTER_XFORMS_CLASS(name) \
	aServices.realloc(1); \
	aServices.getArray()[0] = rtl::OUString::createFromAscii( "com.sun.star.xforms." #name ); \
	REGISTER_CLASS_CORE(name)

    REGISTER_XFORMS_CLASS(Model);
    REGISTER_XFORMS_CLASS(XForms);

}

//=======================================================================================
extern "C"
{

//---------------------------------------------------------------------------------------
void SAL_CALL createRegistryInfo_ODatabaseForm();
void SAL_CALL createRegistryInfo_OFilterControl();
void SAL_CALL createRegistryInfo_OScrollBarModel();
void SAL_CALL createRegistryInfo_OSpinButtonModel();
void SAL_CALL createRegistryInfo_ONavigationBarModel();
void SAL_CALL createRegistryInfo_ONavigationBarControl();
void SAL_CALL createRegistryInfo_ORichTextModel();
void SAL_CALL createRegistryInfo_ORichTextControl();
void SAL_CALL createRegistryInfo_CLibxml2XFormsExtension();
void SAL_CALL createRegistryInfo_FormOperations();

//---------------------------------------------------------------------------------------
void SAL_CALL createRegistryInfo_FORMS()
{
	static sal_Bool bInit = sal_False;
	if (!bInit)
	{
		createRegistryInfo_ODatabaseForm();
		createRegistryInfo_OFilterControl();
		createRegistryInfo_OScrollBarModel();
		createRegistryInfo_OSpinButtonModel();
        createRegistryInfo_ONavigationBarModel();
        createRegistryInfo_ONavigationBarControl();
        createRegistryInfo_ORichTextModel();
        createRegistryInfo_ORichTextControl();
        createRegistryInfo_CLibxml2XFormsExtension();
        createRegistryInfo_FormOperations();
		bInit = sal_True;
	}
}

//---------------------------------------------------------------------------------------
SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(const sal_Char** _ppEnvTypeName, uno_Environment** /*_ppEnv*/)
{
	*_ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
}

//---------------------------------------------------------------------------------------
SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(const sal_Char* _pImplName, XMultiServiceFactory* _pServiceManager, void* /*_pRegistryKey*/)
{
	if (!_pServiceManager || !_pImplName)
		return NULL;

    // ========================================================================
	// a lot of stuff which is implemented "manually" here in this file
	void* pRet = NULL;

	// collect the class infos
	ensureClassInfos();

	// both our static sequences should have the same length ...
	sal_Int32 nClasses = s_aClassImplementationNames.getLength();
	OSL_ENSURE((s_aClassServiceNames.getLength() == nClasses) &&
		(s_aFactories.getLength() == nClasses),
		"forms::component_writeInfo : invalid class infos !");

	// loop through the sequences and register the service providers
	const ::rtl::OUString* pClasses = s_aClassImplementationNames.getConstArray();
	const Sequence< ::rtl::OUString >* pServices = s_aClassServiceNames.getConstArray();
	const sal_Int64* pFunctionsAsInts = s_aFactories.getConstArray();

	for (sal_Int32 i=0; i<nClasses; ++i, ++pClasses, ++pServices, ++pFunctionsAsInts)
	{
		if( pClasses->compareToAscii( _pImplName) == 0)
		{
			::cppu::ComponentInstantiation aCurrentCreateFunction =
				reinterpret_cast< ::cppu::ComponentInstantiation>(*pFunctionsAsInts);

			Reference<XSingleServiceFactory> xFactory(
				::cppu::createSingleFactory(
					_pServiceManager,
					*pClasses,
					aCurrentCreateFunction,
					*pServices
				)
			);
			if (xFactory.is())
			{
				xFactory->acquire();
				pRet = xFactory.get();
				break;
			}
		}
	}

    // ========================================================================
	// the real way - use the OModule
	if ( !pRet )
	{
		createRegistryInfo_FORMS();
		{
			// let the module look for the component
			Reference< XInterface > xRet;
			xRet = ::frm::OFormsModule::getComponentFactory(
				::rtl::OUString::createFromAscii( _pImplName ),
				static_cast< XMultiServiceFactory* >( _pServiceManager ) );

			if ( xRet.is() )
				xRet->acquire();
			pRet = xRet.get();
		}
	}

	return pRet;
}

}
