/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/

#include <cppuhelper/implbase3.hxx>
#include <cppuhelper/factory.hxx>
#include <cppuhelper/implementationentry.hxx>

#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <com/sun/star/accessibility/XMSAAService.hpp>

#include <com/sun/star/awt/XExtendedToolkit.hpp>
#include <vcl/svapp.hxx>

using namespace ::rtl; // for OUString
using namespace ::com::sun::star; // for odk interfaces
using namespace ::com::sun::star::uno; // for basic types
using namespace ::com::sun::star::accessibility;

using namespace ::com::sun::star::awt;

typedef sal_Int32 HWND;

#include "AccTopWindowListener.hxx"
#include "g_msacc.hxx"

extern void FreeTopWindowListener();
extern long GetMSComPtr(long hWnd, long lParam, long wParam);
extern void handleWindowOpened_impl( long pAcc);


namespace my_sc_impl
{

extern Sequence< OUString > SAL_CALL  getSupportedServiceNames_MSAAServiceImpl();
extern OUString SAL_CALL getImplementationName_MSAAServiceImpl();
extern Reference< XInterface > SAL_CALL create_MSAAServiceImpl(
        Reference< XComponentContext > const & xContext )
    SAL_THROW( () );
/**
   * Method that returns the service name.
   * @param
   * @return Name sequence.
   */
static Sequence< OUString > getSupportedServiceNames_MSAAServiceImpl()
{
    static Sequence < OUString > *pNames = 0;
    if( ! pNames )
    {
        //		MutexGuard guard( Mutex::getGlobalMutex() );
        if( !pNames )
        {
            static Sequence< OUString > seqNames(1);
            seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.MSAAService"));
            pNames = &seqNames;
        }
    }
    return *pNames;
}

/**
   * Method that returns the service name.
   * @param
   * @return Name sequence.
   */
static OUString getImplementationName_MSAAServiceImpl()
{
    static OUString *pImplName = 0;
    if( ! pImplName )
    {
        //		MutexGuard guard( Mutex::getGlobalMutex() );
        if( ! pImplName )
        {
            static OUString implName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_implementation.MSAAService") );
            pImplName = &implName;
        }
    }
    return *pImplName;
}

class MSAAServiceImpl : public ::cppu::WeakImplHelper3<
            XMSAAService, lang::XServiceInfo, lang::XInitialization >
{
    OUString m_arg;
public:
    // focus on three given interfaces,
    // no need to implement XInterface, XTypeProvider, XWeak
    MSAAServiceImpl ();
    virtual ~MSAAServiceImpl( void );
    // XInitialization will be called upon createInstanceWithArguments[AndContext]()
    virtual void SAL_CALL initialize( Sequence< Any > const & args )
    throw (Exception);
    // XMSAAService
    virtual sal_Int32 SAL_CALL getAccObjectPtr (long hWnd, long lParam, long wParam)
    throw (RuntimeException);
    virtual void SAL_CALL handleWindowOpened(sal_Int32)
    throw (RuntimeException);
    // XServiceInfo
    virtual OUString SAL_CALL getImplementationName()
    throw (RuntimeException);
    virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName )
    throw (RuntimeException);
    virtual Sequence< OUString > SAL_CALL getSupportedServiceNames()
    throw (RuntimeException);
};

/**
   * Implemention of XInitialization.
   * @param
   * @return.
   */
void MSAAServiceImpl::initialize( Sequence< Any > const & args ) throw (Exception)
{
    if (1 != args.getLength())
    {
        throw lang::IllegalArgumentException(
            OUString( RTL_CONSTASCII_USTRINGPARAM("give a string instanciating this component!") ),
            (::cppu::OWeakObject *)this, // resolve to XInterface reference
            0 ); // argument pos
    }
    if (! (args[ 0 ] >>= m_arg))
    {
        throw lang::IllegalArgumentException(
            OUString( RTL_CONSTASCII_USTRINGPARAM("no string given as argument!") ),
            (::cppu::OWeakObject *)this, // resolve to XInterface reference
            0 ); // argument pos
    }
}

/**
   * Implemention of getAccObjectPtr.
   * @param
   * @return Com interface.
   */
sal_Int32 MSAAServiceImpl::getAccObjectPtr ( long hWnd, long lParam, long wParam) throw (RuntimeException)
{
    return GetMSComPtr(hWnd, lParam, wParam);
}

/**
   * Implemention of handleWindowOpened,the method will be invoked when a top window
   * opened and AT starts up.
   * @param
   * @return
   */
void MSAAServiceImpl::handleWindowOpened( sal_Int32 pAcc)
{
    handleWindowOpened_impl(pAcc);
}

/**
   * Implemention of XServiceInfo.
   * @param
   * @return Implementataion name.
   */
OUString MSAAServiceImpl::getImplementationName() throw (RuntimeException)
{
    // unique implementation name
    return OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_impl.MSAAService") );
}

/**
   * Implemention of XServiceInfo,return support service name.
   * @param Service name.
   * @return If the service name is supported.
   */
sal_Bool MSAAServiceImpl::supportsService( OUString const & serviceName ) throw (RuntimeException)
{
    // this object only supports one service, so the test is simple
    return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.accessibility.MSAAService") );
}

/**
   * Implemention of XServiceInfo,return all service names.
   * @param.
   * @return service name sequence.
   */
Sequence< OUString > MSAAServiceImpl::getSupportedServiceNames() throw (RuntimeException)
{
    return getSupportedServiceNames_MSAAServiceImpl();
}

/**
   * Static method that can create an entity of our MSAA Service
   * @param xContext No use here.
   * @return The object interface.
   */
Reference< XInterface > SAL_CALL create_MSAAServiceImpl( Reference< XComponentContext > const & /*xContext*/ ) SAL_THROW( () )
{
    MSAAServiceImpl* xxx = new MSAAServiceImpl();
    //return static_cast< lang::XTypeProvider * >(  xxx );
    Reference< XMSAAService > p( xxx );
    return p;
}

/**
   * Constructor.
   * @param 
   * @return
   */
MSAAServiceImpl::MSAAServiceImpl()
{
    Reference< XExtendedToolkit > xToolkit =
        Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY);

    if(xToolkit.is())
    {
        AccTopWindowListener *accListener;
        accListener = new AccTopWindowListener();
        g_pTop = accListener;
        Reference< XTopWindowListener> x(accListener);
        xToolkit->addTopWindowListener(x);
    }
}

/**
   * Static method that can create an entity of our MSAA Service
   * @param Destructor
   * @return
   */
MSAAServiceImpl::~MSAAServiceImpl()
{

    // As all folders and streams contain references to their parents,
    // we must remove these references so that they will be deleted when
    // the hash_map of the root folder is cleared, releasing all subfolders
    // and substreams which in turn release theirs, etc. When xRootFolder is
    // released when this destructor completes, the folder tree should be
    // deleted fully (and automagically).
    FreeTopWindowListener();


}

}

/* shared lib exports implemented without helpers in service_impl1.cxx */
namespace my_sc_impl
{
static struct ::cppu::ImplementationEntry s_component_entries [] =
    {
        {
            create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl,
            getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory,
            0, 0
        },
        {
            create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl,
            getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory,
            0, 0
        },
        { 0, 0, 0, 0, 0, 0 }
    };
}

extern "C"
{
    void SAL_CALL component_getImplementationEnvironment(
        sal_Char const ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ )
    {
        *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
    }
    void * SAL_CALL component_getFactory(
        sal_Char const * implName, lang::XMultiServiceFactory * xMgr,
        registry::XRegistryKey * xRegistry )
    {
        return ::cppu::component_getFactoryHelper(
                   implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries );
    }
}
