<commit_before>/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: configinteractionhandler.cxx,v $
 *
 *  $Revision: 1.3 $
 *
 *  last change: $Author: rt $ $Date: 2005-09-08 04:09:15 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#include "configinteractionhandler.hxx"

#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
#include <com/sun/star/task/XInteractionHandler.hpp>
#endif

#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase1.hxx>
#endif

#include <uno/current_context.hxx>
#include <map>

namespace configmgr {
namespace apihelper {
//=========================================================================
    namespace uno  = com::sun::star::uno;
    namespace task = com::sun::star::task;
    using rtl::OUString;
//=========================================================================
#define OU2A(rtlOUString)   (::rtl::OUStringToOString((rtlOUString), RTL_TEXTENCODING_ASCII_US).getStr())
#define OUSTR(txt)  ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(txt) )

//========================================================================
#define CONFIG_ERROR_HANDLER "configuration.interaction-handler"
//========================================================================

namespace
{
    typedef uno::Reference< uno::XCurrentContext > CurrentContext;
    class SimpleCurrentContext : public cppu::WeakImplHelper1< uno::XCurrentContext >
    {
        CurrentContext m_xChainedContext;
        typedef std::map< OUString, uno::Any > Settings;
        Settings m_settings;
    public:
        explicit
        SimpleCurrentContext(const CurrentContext & xChainedContext)
        : m_xChainedContext(xChainedContext)
        {}

        void addSetting(const OUString & aName, const uno::Any & aValue)
        { m_settings[aName] = aValue; }

        void install()      { uno::setCurrentContext(this); }
        void deinstall()    { uno::setCurrentContext(m_xChainedContext); }

        uno::Any getChainedValueByName( OUString const & aName) const
        {
            return m_xChainedContext.is()
                            ? m_xChainedContext->getValueByName(aName)
                            : uno::Any();
        }

        // XCurrentContext
        uno::Any SAL_CALL
            getValueByName( OUString const & aName)
                throw (uno::RuntimeException);
    };

    uno::Any SAL_CALL
        SimpleCurrentContext::getValueByName( OUString const & aName)
            throw (uno::RuntimeException)
    {
        Settings::iterator it = m_settings.find(aName);
        if (it != m_settings.end())
            return it->second;
        else
            return getChainedValueByName(aName);
    }

}
//========================================================================
class ConfigurationInteractionHandler::Context : public SimpleCurrentContext
{
public:
    explicit
    Context()
    : SimpleCurrentContext( uno::getCurrentContext() )
    {
        addSetting( OUSTR(CONFIG_ERROR_HANDLER), uno::Any() );
    }

    ~Context()
    {
    }

    bool hasInteractionHandler() const
    {
        return getInteractionHandler().is();
    }

    uno::Reference< task::XInteractionHandler > getInteractionHandler() const
    {
        uno::Reference< task::XInteractionHandler > xHandler;
        getChainedValueByName( OUSTR(CONFIG_ERROR_HANDLER) ) >>= xHandler;
        return xHandler;
    }
};
//========================================================================
ConfigurationInteractionHandler::ConfigurationInteractionHandler()
: m_pContext( 0 )
{
    try
    {
        Context * pContext = new Context();
        CurrentContext xContext(pContext);

        if (pContext->hasInteractionHandler())
        {
            m_pContext = pContext;
            m_pContext->acquire();
            m_pContext->install();
        }
    }
    catch (uno::Exception & e)
    {
        OSL_TRACE("Warning - Configuration: Retrieving error (interaction) handler failed: [%s]\n", OU2A(e.Message));
    }
}
//------------------------------------------------------------------------------
ConfigurationInteractionHandler::~ConfigurationInteractionHandler()
{
    if (m_pContext)
    {
        m_pContext->deinstall();
        m_pContext->release();
    }
}

//------------------------------------------------------------------------------
void ConfigurationInteractionHandler::handle( const uno::Reference< task::XInteractionRequest > & xRequest )
{
    if (m_pContext)
    {
        uno::Reference< task::XInteractionHandler > xHandler = m_pContext->getInteractionHandler();
        if (xHandler.is()) xHandler->handle(xRequest);
    }
}
//=========================================================================

} // namespace apihelper
} // namespace configmgr
<commit_msg>INTEGRATION: CWS sb42 (1.3.26); FILE MERGED 2006/01/04 15:51:33 sb 1.3.26.1: #i55137# When a corrupted configuration has been detected, while calling the interaction handler to ask whether to repair it, the interaction handler might try recursively a second time to create a view on the corrupted data.<commit_after>/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: configinteractionhandler.cxx,v $
 *
 *  $Revision: 1.4 $
 *
 *  last change: $Author: hr $ $Date: 2006-01-24 16:43:22 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#include "sal/config.h"

#include "configinteractionhandler.hxx"

#include "com/sun/star/task/XInteractionHandler.hpp"
#include "com/sun/star/uno/Any.hxx"
#include "com/sun/star/uno/Reference.hxx"
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/XCurrentContext.hpp"
#include "cppuhelper/implbase1.hxx"
#include "rtl/string.h"
#include "rtl/ustring.h"
#include "rtl/ustring.hxx"
#include "uno/current_context.hxx"

namespace {

namespace css = com::sun::star;

static char const INTERACTION_HANDLER[] = "configuration.interaction-handler";

}

namespace configmgr { namespace apihelper {

class ConfigurationInteractionHandler::Context:
    public cppu::WeakImplHelper1< css::uno::XCurrentContext >
{
public:
    explicit Context(ConfigurationInteractionHandler * parent):
        m_parent(parent) {}

    virtual css::uno::Any SAL_CALL getValueByName(rtl::OUString const & name)
        throw (css::uno::RuntimeException)
    {
        return
            name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(INTERACTION_HANDLER))
            ? m_handler : m_parent->getPreviousContextValue(name);
    }

    void setInteractionHandler(
        css::uno::Reference< css::task::XInteractionHandler > const & handler)
    { m_handler <<= handler; }

private:
    Context(Context &); // not defined
    void operator =(Context &); // not defined

    virtual ~Context() {}

    ConfigurationInteractionHandler * m_parent;
    css::uno::Any m_handler;
};

ConfigurationInteractionHandler::ConfigurationInteractionHandler():
    m_context(new Context(this)), m_layer(m_context.get()) {}

ConfigurationInteractionHandler::~ConfigurationInteractionHandler() {}

css::uno::Reference< css::task::XInteractionHandler >
ConfigurationInteractionHandler::get() const {
    return css::uno::Reference< css::task::XInteractionHandler >(
        getPreviousContextValue(
            rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(INTERACTION_HANDLER))),
        css::uno::UNO_QUERY);
}

void ConfigurationInteractionHandler::setRecursive(
    css::uno::Reference< css::task::XInteractionHandler > const & handler)
{
    m_context->setInteractionHandler(handler);
}

css::uno::Any ConfigurationInteractionHandler::getPreviousContextValue(
    rtl::OUString const & name) const
{
    css::uno::Reference< css::uno::XCurrentContext > c(
        m_layer.getPreviousContext());
    return c.is() ? c->getValueByName(name) : css::uno::Any();
}

} }

{'fraction_non_alphanumeric': 0.1975222993062438, 'fraction_numerical': 0.013280475718533202, 'mean_word_length': 3.56606334841629, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 34, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 1, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '669967', 'n_tokens_mistral': 2856, 'n_tokens_neox': 2689, 'n_words': 692}