/*
 *          Warning!!!
 *       DO NOT ALTER THIS FILE!
 */


#ifndef __COMPONENT_BASE_H__
#define __COMPONENT_BASE_H__

#include "types.h"
////////////////////////////////////////////////////////////////////////////////
/**
 *  The given interface is intended for initialization and 
 *  uninitialization of component and its adjustments
 */
/// Interface of component initialization.
class IInitDoneBase
{
public:
    virtual ~IInitDoneBase() {}
    /// Initializes component
    /**
     *  @param disp - 1C:Enterpise interface
     *  @return the result of
     */
    virtual bool ADDIN_API Init(void* disp) = 0;
    /// Sets the memory manager
    /*
     * @param mem - pointer to memory manager interface.
     *  @return the result of
     */
    virtual bool ADDIN_API setMemManager(void* mem) = 0;

    /// Returns component version
    /**
     *  @return - component version (2000 - version 2)
     */
    virtual long ADDIN_API GetInfo() = 0;

    /// Uninitializes component
    /**
     *  Component here should release all consumed resources.
     */
    virtual void ADDIN_API Done() = 0;

};
///////////////////////////////////////////////////////////////////////////
/**
 *  The given interface defines methods that are intented to be used by the Platform
 */
/// Interface describing extension of language.
class ILanguageExtenderBase
{
public:
    virtual ~ILanguageExtenderBase(){}
    /// Registers language extension
    /**
     *  @param wsExtensionName - extension name
     *  @return the result of
     */
    virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T** wsExtensionName) = 0;

    /// Returns number of component properties
    /**
     *  @return number of properties
     */
    virtual long ADDIN_API GetNProps() = 0;

    /// Finds property by name
    /**
     *  @param wsPropName - property name
     *  @return property index or -1, if it is not found
     */
    virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName) = 0;

    /// Returns property name
    /**
     *  @param lPropNum - property index (starting with 0)
     *  @param lPropAlias - 0 - international alias,
     *      1 - russian alias. (International alias is required)
     *  @return proeprty name or 0 if it is not found
     */
    virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum,  
						 long lPropAlias) = 0;

    /// Returns property value
    /**
     *  @param lPropNum - property index (starting with 0)
     *  @param pvarPropVal - the pointer to a variable for property value
     *  @return the result of
     */
    virtual bool ADDIN_API GetPropVal(const long lPropNum, 
				      tVariant* pvarPropVal) = 0;

    /// Sets the property value
    /**
     *  @param lPropNum - property index (starting with 0)
     *  @param varPropVal - the pointer to a variable for property value
     *  @return the result of
     */
    virtual bool ADDIN_API SetPropVal(const long lPropNum, 
				      tVariant* varPropVal) = 0;

    /// Is property readable?
    /**
     *  @param lPropNum - property index (starting with 0)
     *  @return true if property is readable
     */
    virtual bool ADDIN_API IsPropReadable(const long lPropNum) = 0;

    /// Is property writable?
    /**
     *  @param lPropNum - property index (starting with 0)
     *  @return true if property is writable
     */
    virtual bool ADDIN_API IsPropWritable(const long lPropNum) = 0;

    /// Returns number of component methods
    /**
     *  @return number of component  methods
     */
    virtual long ADDIN_API GetNMethods() = 0;

    /// Finds a method by name 
    /**
     *  @param wsMethodName - method name
     *  @return - method index
     */
    virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName) = 0;

    /// Returns method name
    /**
     *  @param lMethodNum - method index(starting with 0)
     *  @param lMethodAlias - 0 - international alias,
     *      1 - russian alias. (International alias is required)
     *  @return method name or 0 if method is not found
     */
    virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum, 
						   const long lMethodAlias) = 0;

    /// Returns number of method parameters
    /**
     *  @param lMethodNum - method index (starting with 0)
     *  @return number of parameters
     */
    virtual long ADDIN_API GetNParams(const long lMethodNum) = 0;

    /// Returns default value of method parameter
    /**
     *  @param lMethodNum - method index(starting with 0)
     *  @param lParamNum - parameter index (starting with 0)
     *  @param pvarParamDefValue - the pointer to a variable for default value
     *  @return the result of
     */
    virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, 
					    const long lParamNum,
					    tVariant *pvarParamDefValue) = 0;

    /// Does the method have a return value?
    /**
     *  @param lMethodNum - method index (starting with 0)
     *  @return true if the method has a return value
     */
    virtual bool ADDIN_API HasRetVal(const long lMethodNum) = 0;

    /// Calls the method as a procedure
    /**
     *  @param lMethodNum - method index (starting with 0)
     *  @param paParams - the pointer to array of method parameters
     *  @param lSizeArray - the size of array
     *  @return the result of
     */
    virtual bool ADDIN_API CallAsProc(const long lMethodNum,
				      tVariant* paParams, 
				      const long lSizeArray) = 0;

    /// Calls the method as a function
    /**
     *  @param lMethodNum - method index (starting with 0)
     *  @param pvarRetValue - the pointer to returned value
     *  @param paParams - the pointer to array of method parameters
     *  @param lSizeArray - the size of array
     *  @return the result of
     */
    virtual bool ADDIN_API CallAsFunc(const long lMethodNum,
				      tVariant* pvarRetValue, 
				      tVariant* paParams, 
				      const long lSizeArray) = 0;    
};
///////////////////////////////////////////////////////////////////////////
/**
 *  This interface is used to change component locale
 */
/// Base interface for component localization.
class LocaleBase
{
public:
    virtual ~LocaleBase(){}
    /// Changes component locale
    /**
     *  @param loc - new locale (for Windows - rus_RUS, 
     *      for Linux - ru_RU, etc...)
     */
    virtual void ADDIN_API SetLocale(const WCHAR_T* loc) = 0;
};

///////////////////////////////////////////////////////////////////////
/// class UserLanguageBase- интерфейс изменения языка компоненты
/**
 *  Этот интерфейс предназначен для изменения локализации компоненты
 */
class UserLanguageBase
{
public:
    virtual ~UserLanguageBase() {}
    /// Изменение локали компоненты
    /**
     *  @param const char16_t* lang - устанавливаемый язык (ru, etc...)
     */
    virtual void ADDIN_API SetUserInterfaceLanguageCode(const WCHAR_T* lang) = 0;
};

///////////////////////////////////////////////////////////////////////////
/**
 *  The given interface is generalized, for its obligatory inheritance 
 *  in implementing components.
 */
///  Base interface describing object as a set of properties and methods.
class IComponentBase :
    public IInitDoneBase,
    public ILanguageExtenderBase,
    public LocaleBase,
    public UserLanguageBase
{
public:
    virtual ~IComponentBase(){}
};

enum AppCapabilities
{
    eAppCapabilitiesInvalid = -1,
    eAppCapabilities1 = 1,
    eAppCapabilities2 = 2,
    eAppCapabilities3 = 3,
    eAppCapabilitiesLast = eAppCapabilities3,
};

enum AttachType
{
    eCanAttachNotIsolated = 1,
    eCanAttachIsolated,
    eCanAttachAny,
};

/// Announcements of exported functions
/**
 * These functions should be implemented that component can be loaded and created. 
 */
extern "C" long GetClassObject(const WCHAR_T*, IComponentBase** pIntf);
extern "C" long DestroyObject(IComponentBase** pIntf);
extern "C" const WCHAR_T* GetClassNames();
extern "C" AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities);
extern "C" AttachType GetAttachType();

typedef long (*GetClassObjectPtr)(const WCHAR_T* wsName, IComponentBase** pIntf);
typedef long (*DestroyObjectPtr)(IComponentBase** pIntf);
typedef const WCHAR_T* (*GetClassNamesPtr)();
typedef AppCapabilities (*SetPlatformCapabilitiesPtr)(const AppCapabilities capabilities);
typedef AttachType (*GetAttachTypePtr)();

#endif //__COMPONENT_BASE_H__
