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

#include <svtools/helpopt.hxx>
#include <unotools/configmgr.hxx>
#include <unotools/configitem.hxx>
#include <tools/debug.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <vcl/help.hxx>
#include <osl/mutex.hxx>
#include <comphelper/stl_types.hxx>

#include <rtl/logfile.hxx>
#include "itemholder2.hxx"

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

static SvtHelpOptions_Impl* pOptions = NULL;
static sal_Int32           nRefCount = 0;

#define EXTENDEDHELP		0
#define HELPTIPS			1
#define AGENT_ENABLED		2
#define AGENT_TIMEOUT		3
#define AGENT_RETRYLIMIT	4
#define LOCALE				5
#define SYSTEM				6
#define STYLESHEET          7

class SvtHelpOptions_Impl : public utl::ConfigItem
{
    IdList*         pList;
	sal_Int32		nHelpAgentTimeoutPeriod;
	sal_Int32		nHelpAgentRetryLimit;
    sal_Bool        bExtendedHelp;
    sal_Bool        bHelpTips;
    sal_Bool        bHelpAgentEnabled;
    sal_Bool        bWelcomeScreen;
	String			aLocale;
	String			aSystem;
    String          sHelpStyleSheet;

	DECLARE_STL_USTRINGACCESS_MAP( sal_Int32, MapString2Int );
	MapString2Int	aURLIgnoreCounters;
	::osl::Mutex	aIgnoreCounterSafety;

    Sequence< OUString > GetPropertyNames();

public:
                    SvtHelpOptions_Impl();

    virtual void    Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
    void            Load( const ::com::sun::star::uno::Sequence< ::rtl::OUString>& aPropertyNames);
    virtual void    Commit();

    void            SetExtendedHelp( sal_Bool b )           { bExtendedHelp= b; SetModified(); }
    sal_Bool        IsExtendedHelp() const                  { return bExtendedHelp; }
    void            SetHelpTips( sal_Bool b )               { bHelpTips = b; SetModified(); }
    sal_Bool        IsHelpTips() const                      { return bHelpTips; }

    void            SetHelpAgentEnabled( sal_Bool b	)		{ bHelpAgentEnabled = b; SetModified(); }
    sal_Bool        IsHelpAgentEnabled() const				{ return bHelpAgentEnabled; }
	void			SetHelpAgentTimeoutPeriod( sal_Int32 _nSeconds )	{ nHelpAgentTimeoutPeriod = _nSeconds; SetModified(); }
	sal_Int32		GetHelpAgentTimeoutPeriod( ) const		{ return nHelpAgentTimeoutPeriod; }
	void			SetHelpAgentRetryLimit( sal_Int32 _nTrials )		{ nHelpAgentRetryLimit = _nTrials; SetModified(); }
	sal_Int32		GetHelpAgentRetryLimit( ) const			{ return nHelpAgentRetryLimit; }

	sal_Int32		getAgentIgnoreURLCounter( const ::rtl::OUString& _rURL );
	void			decAgentIgnoreURLCounter( const ::rtl::OUString& _rURL );
	void			resetAgentIgnoreURLCounter( const ::rtl::OUString& _rURL );
	void			resetAgentIgnoreURLCounter();

    void            SetWelcomeScreen( sal_Bool b )          { bWelcomeScreen = b; SetModified(); }
    sal_Bool        IsWelcomeScreen() const                 { return bWelcomeScreen; }
    IdList*         GetPIStarterList()                      { return pList; }
    void            AddToPIStarterList( sal_Int32 nId );
    void            RemoveFromPIStarterList( sal_Int32 nId );
	String			GetLocale() const						{ return aLocale; }
	String			GetSystem() const						{ return aSystem; }

    const String&   GetHelpStyleSheet()const{return sHelpStyleSheet;}
    void            SetHelpStyleSheet(const String& rStyleSheet){sHelpStyleSheet = rStyleSheet; SetModified();}

    static ::osl::Mutex & getInitMutex();

protected:
	void	implLoadURLCounters();
	void	implSaveURLCounters();
	// to be called with aIgnoreCounterSafety locked
	void	implGetURLCounters( Sequence< ::rtl::OUString >& _rNodeNames, Sequence< Any >& _rURLs, Sequence< Any >& _rCounter );
};

Sequence< OUString > SvtHelpOptions_Impl::GetPropertyNames()
{
	static const char* aPropNames[] =
	{
        "ExtendedTip",
        "Tip",
		"HelpAgent/Enabled",
		"HelpAgent/Timeout",
		"HelpAgent/RetryLimit",
		"Locale",
		"System",
        "HelpStyleSheet",
//		"HowTo/Show"
	};

    const int nCount = sizeof( aPropNames ) / sizeof( const char* );
	Sequence< OUString > aNames( nCount );
	OUString* pNames = aNames.getArray();
	for ( int i = 0; i < nCount; i++ )
		pNames[i] = OUString::createFromAscii( aPropNames[i] );

	return aNames;
}

::osl::Mutex & SvtHelpOptions_Impl::getInitMutex()
{
    static ::osl::Mutex *pMutex = 0;

    if( ! pMutex )
    {
        ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
        if( ! pMutex )
        {
            static ::osl::Mutex mutex;
            pMutex = &mutex;
        }
    }
    return *pMutex;
}


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

SvtHelpOptions_Impl::SvtHelpOptions_Impl()
    : ConfigItem( OUString::createFromAscii("Office.Common/Help") )
    , pList( 0 )
    , bExtendedHelp( sal_False )
    , bHelpTips( sal_True )
    , bHelpAgentEnabled( sal_False )
    , bWelcomeScreen( sal_False )
{
	Sequence< OUString > aNames = GetPropertyNames();
    Load( aNames );
    EnableNotification( aNames );
    implLoadURLCounters();
}

// -----------------------------------------------------------------------
static int lcl_MapPropertyName( const ::rtl::OUString rCompare,
                const uno::Sequence< ::rtl::OUString>& aInternalPropertyNames)
{
    for(int nProp = 0; nProp < aInternalPropertyNames.getLength(); ++nProp)
    {        
        if( aInternalPropertyNames[nProp] == rCompare )
            return nProp;
    }
    return -1;    
}

void  SvtHelpOptions_Impl::Load(const uno::Sequence< ::rtl::OUString>& rPropertyNames)
{
    const uno::Sequence< ::rtl::OUString> aInternalPropertyNames( GetPropertyNames());
    Sequence< Any > aValues = GetProperties( rPropertyNames );
    const Any* pValues = aValues.getConstArray();
    DBG_ASSERT( aValues.getLength() == rPropertyNames.getLength(), "GetProperties failed" );
    if ( aValues.getLength() == rPropertyNames.getLength() )
    {
        for ( int nProp = 0; nProp < rPropertyNames.getLength(); nProp++ )
        {
            DBG_ASSERT( pValues[nProp].hasValue(), "property value missing" );
            if ( pValues[nProp].hasValue() )
            {
                sal_Bool bTmp = sal_Bool();
                ::rtl::OUString aTmpStr;
                sal_Int32 nTmpInt = 0;
                if ( pValues[nProp] >>= bTmp )
                {
                    switch ( lcl_MapPropertyName(rPropertyNames[nProp], aInternalPropertyNames) )
                    {
                        case EXTENDEDHELP :
                            bExtendedHelp = bTmp;
                            break;
                        case HELPTIPS :
                            bHelpTips = bTmp;
                            break;
                        case AGENT_ENABLED :
                            bHelpAgentEnabled = bTmp;
                            break;
                        default:
                            DBG_ERRORFILE( "Wrong Member!" );
                            break;
                    }
                }
                else if ( pValues[nProp] >>= aTmpStr )
                {
                    switch ( nProp )
                    {
                        case LOCALE:
                            aLocale = aTmpStr;
                            break;

                        case SYSTEM:
                            aSystem = aTmpStr;
                            break;
                        case STYLESHEET :
                            sHelpStyleSheet = aTmpStr;
                        break;
                        default:
                            DBG_ERRORFILE( "Wrong Member!" );
                            break;
                    }
                }
                else if ( pValues[nProp] >>= nTmpInt )
                {
                    switch ( nProp )
                    {
                        case AGENT_TIMEOUT:
                            nHelpAgentTimeoutPeriod = nTmpInt;
                            break;

                        case AGENT_RETRYLIMIT:
                            nHelpAgentRetryLimit = nTmpInt;
                            break;

                        default:
                            DBG_ERRORFILE( "Wrong Member!" );
                            break;
                    }
                }
                else
                {
		    DBG_ERRORFILE( "Wrong Type!" );
		}
            }
        }
        if ( IsHelpTips() != Help::IsQuickHelpEnabled() )
            IsHelpTips() ? Help::EnableQuickHelp() : Help::DisableQuickHelp();
        if ( IsExtendedHelp() != Help::IsBalloonHelpEnabled() )
            IsExtendedHelp() ? Help::EnableBalloonHelp() : Help::DisableBalloonHelp();
    }
}

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

void SvtHelpOptions_Impl::implGetURLCounters( Sequence< ::rtl::OUString >& _rNodeNames, Sequence< Any >& _rURLs, Sequence< Any >& _rCounters )
{
	// the ignore counters for the help agent URLs
	const ::rtl::OUString sIgnoreListNodePath = ::rtl::OUString::createFromAscii("HelpAgent/IgnoreList");
	const ::rtl::OUString sPathSeparator = ::rtl::OUString::createFromAscii("/");
	const ::rtl::OUString sURLLocalPath = ::rtl::OUString::createFromAscii("/Name");
	const ::rtl::OUString sCounterLocalPath = ::rtl::OUString::createFromAscii("/Counter");

	// get the names of all the nodes containing ignore counters
	// collect the node names we have to ask
	// first get the node names of all children of HelpAgent/IgnoreList
	_rNodeNames = GetNodeNames(sIgnoreListNodePath);
	const ::rtl::OUString* pIgnoredURLsNodes = _rNodeNames.getConstArray();
	const ::rtl::OUString* pIgnoredURLsNodesEnd = pIgnoredURLsNodes + _rNodeNames.getLength();

	// then assemble the two lists (of node paths) for the URLs and the counters
	Sequence< ::rtl::OUString > aIgnoredURLs(_rNodeNames.getLength());
	Sequence< ::rtl::OUString > aIgnoredURLsCounter(_rNodeNames.getLength());
	::rtl::OUString* pIgnoredURLs = aIgnoredURLs.getArray();
	::rtl::OUString* pIgnoredURLsCounter = aIgnoredURLsCounter.getArray();
	for (;pIgnoredURLsNodes != pIgnoredURLsNodesEnd; ++pIgnoredURLsNodes, ++pIgnoredURLs, ++pIgnoredURLsCounter)
	{
		::rtl::OUString sLocalURLAccess = sIgnoreListNodePath;
		sLocalURLAccess += sPathSeparator;
		sLocalURLAccess += *pIgnoredURLsNodes;

		// the path to the URL of this specific entry
		*pIgnoredURLs = sLocalURLAccess;
		*pIgnoredURLs += sURLLocalPath;

		// the path of the counter for that URL
		*pIgnoredURLsCounter = sLocalURLAccess;
		*pIgnoredURLsCounter += sCounterLocalPath;
	}

	// now collect the values
	_rURLs = GetProperties(aIgnoredURLs);
	_rCounters = GetProperties(aIgnoredURLsCounter);

	sal_Int32 nURLs = _rURLs.getLength();
	sal_Int32 nCounters = _rCounters.getLength();
	DBG_ASSERT(nURLs == nCounters, "SvtHelpOptions_Impl::implGetURLCounters: inconsistence while retrieving the visited URLs!");

	// normalize in case something went wrong
	sal_Int32 nKnownURLs = nURLs < nCounters ? nURLs : nCounters;
	if (nURLs < nCounters)
	{
		_rCounters.realloc(nKnownURLs);
		_rNodeNames.realloc(nKnownURLs);
	}
	else if (nURLs > nCounters)
	{
		_rURLs.realloc(nKnownURLs);
		_rNodeNames.realloc(nKnownURLs);
	}
}

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

void SvtHelpOptions_Impl::implSaveURLCounters()
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);

	const ::rtl::OUString sIgnoreListNodePath = ::rtl::OUString::createFromAscii("HelpAgent/IgnoreList");
	const ::rtl::OUString sPathSeparator = ::rtl::OUString::createFromAscii("/");
	const ::rtl::OUString sURLLocalPath = ::rtl::OUString::createFromAscii("/Name");
	const ::rtl::OUString sCounterLocalPath = ::rtl::OUString::createFromAscii("/Counter");

	// get the current URL/counter pairs (as they're persistent at the moment)
	Sequence< ::rtl::OUString >	aNodeNames;
	Sequence< Any >				aURLs;
	Sequence< Any >				aCounters;

	implGetURLCounters(aNodeNames, aURLs, aCounters);
	sal_Int32 nKnownURLs = aURLs.getLength();

	const ::rtl::OUString* pNodeNames	= aNodeNames.getConstArray();
	const Any* pURLs					= aURLs.getConstArray();
	const Any* pCounters				= aCounters.getConstArray();

	// check which of them must be deleted/modified
	Sequence< ::rtl::OUString >		aDeleteFromConfig(nKnownURLs);	// names of nodes to be deleted
	::rtl::OUString*				pDeleteFromConfig = aDeleteFromConfig.getArray();
	::std::set< ::rtl::OUString >	aAlreadyPresent;	// URLs currently persistent

	// for modifying already existent nodes
	Sequence< ::rtl::OUString >	aNewCounterNodePaths(nKnownURLs);
	Sequence< Any >				aNewCounterValues(nKnownURLs);
	::rtl::OUString*			pNewCounterNodePaths = aNewCounterNodePaths.getArray();
	Any*						pNewCounterValues = aNewCounterValues.getArray();

	// temporaries needed inside the loop
	::rtl::OUString sCurrentURL, sCurrentURLNodeName;

	for (sal_Int32 i=0; i<nKnownURLs; ++i, ++pNodeNames, ++pURLs, ++pCounters)
	{
		if (!((*pURLs) >>= sCurrentURL))
			continue;

		ConstMapString2IntIterator aThisURLNewCounter = aURLIgnoreCounters.find(sCurrentURL);
		if (aURLIgnoreCounters.end() == aThisURLNewCounter)
		{	// we do not know anything about this URL anymore.
			// -> have to removed it from the configuration later on
			*pDeleteFromConfig = *pNodeNames;
			++pDeleteFromConfig;
		}
		else
		{	// we know this URL
			sCurrentURLNodeName = sIgnoreListNodePath;
			sCurrentURLNodeName += sPathSeparator;
			sCurrentURLNodeName += *pNodeNames;

			// -> remember this (so we don't need to add a new node for this URL later on)
			aAlreadyPresent.insert(sCurrentURL);

			sal_Int32 nThisURLPersistentCounter = 0;
			(*pCounters) >>= nThisURLPersistentCounter;

			if (aThisURLNewCounter->second != nThisURLPersistentCounter)
			{	// the counter changed
				// -> remember the path and the new counter for the adjustment below
				*pNewCounterNodePaths = sCurrentURLNodeName;
				*pNewCounterNodePaths += sCounterLocalPath;
				++pNewCounterNodePaths;

				(*pNewCounterValues) <<= aThisURLNewCounter->second;
				++pNewCounterValues;
			}
		}
	}

	// delete the nodes which are flagged so ...
	aDeleteFromConfig.realloc(pDeleteFromConfig - aDeleteFromConfig.getArray());
	if (0 != aDeleteFromConfig.getLength())
	{
		ClearNodeElements(sIgnoreListNodePath, aDeleteFromConfig);
	}

	// modify the nodes which need to be
	aNewCounterNodePaths.realloc(pNewCounterNodePaths - aNewCounterNodePaths.getArray());
	aNewCounterValues.realloc(pNewCounterValues - aNewCounterValues.getArray());
	if (0 != aNewCounterNodePaths.getLength())
	{
		PutProperties(aNewCounterNodePaths, aNewCounterValues);
	}

	// and for the new ones ...
	::rtl::OUString sNewNodeName;
	Sequence< ::rtl::OUString > aNewCounterDataNodeNames(2);
	Sequence< Any >				aNewCounterDataValues(2);
	const ::rtl::OUString sNodeNameBase = ::rtl::OUString::createFromAscii("URL");
	for (	ConstMapString2IntIterator aCollectNew = aURLIgnoreCounters.begin();
			aCollectNew != aURLIgnoreCounters.end();
			++aCollectNew
		)
	{
		if (aAlreadyPresent.end() == aAlreadyPresent.find(aCollectNew->first))
		{	// this URL is not persistent, yet
			// -> add a new node
			sNewNodeName = sNodeNameBase;
			if (!getUniqueSetElementName(sIgnoreListNodePath, sNewNodeName))
			{
				DBG_ERRORFILE( "SvtHelpOptions_Impl::implSaveURLCounters: could not get a free name!" );
				continue;
			}
			AddNode(sIgnoreListNodePath, sNewNodeName);

			// and set the URL/counter pair
			aNewCounterDataNodeNames[0] = sIgnoreListNodePath;
			aNewCounterDataNodeNames[0] += sPathSeparator;
			aNewCounterDataNodeNames[0] += sNewNodeName;
			aNewCounterDataNodeNames[0] += sURLLocalPath;
			aNewCounterDataValues[0]	<<= aCollectNew->first;

			aNewCounterDataNodeNames[1] = sIgnoreListNodePath;
			aNewCounterDataNodeNames[1] += sPathSeparator;
			aNewCounterDataNodeNames[1] += sNewNodeName;
			aNewCounterDataNodeNames[1] += sCounterLocalPath;
			aNewCounterDataValues[1]	<<= aCollectNew->second;

			PutProperties(aNewCounterDataNodeNames, aNewCounterDataValues);
		}
	}
}

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

void SvtHelpOptions_Impl::implLoadURLCounters()
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);

	Sequence< ::rtl::OUString >	aNodeNames;
	Sequence< Any >				aURLs;
	Sequence< Any >				aCounters;

	implGetURLCounters(aNodeNames, aURLs, aCounters);
	sal_Int32 nKnownURLs = aURLs.getLength();

	const Any* pURLs = aURLs.getConstArray();
	const Any* pCounters = aCounters.getConstArray();

	::rtl::OUString sCurrentURL;
	sal_Int32 nCurrentCounter;
	for (sal_Int32 i=0; i<nKnownURLs; ++i, ++pURLs, ++pCounters)
	{
		(*pURLs) >>= sCurrentURL;
		nCurrentCounter = 0;
		(*pCounters) >>= nCurrentCounter;
		aURLIgnoreCounters[sCurrentURL] = nCurrentCounter;
	}
}

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

void SvtHelpOptions_Impl::Commit()
{
	Sequence< OUString > aNames = GetPropertyNames();
	Sequence< Any > aValues( aNames.getLength() );
	Any* pValues = aValues.getArray();
	for ( int nProp = 0; nProp < aNames.getLength(); nProp++ )
	{
        switch ( nProp )
        {
            case EXTENDEDHELP :
                pValues[nProp] <<= bExtendedHelp;
                break;

            case HELPTIPS :
                pValues[nProp] <<= bHelpTips;
                break;

            case AGENT_ENABLED :
                pValues[nProp] <<= bHelpAgentEnabled;
                break;

			case AGENT_TIMEOUT:
                pValues[nProp] <<= nHelpAgentTimeoutPeriod;
                break;

			case AGENT_RETRYLIMIT:
                pValues[nProp] <<= nHelpAgentRetryLimit;
                break;

			case LOCALE:
                pValues[nProp] <<= ::rtl::OUString(aLocale);
                break;

			case SYSTEM:
                pValues[nProp] <<= ::rtl::OUString(aSystem);
                break;
            case STYLESHEET :
                pValues[nProp] <<= ::rtl::OUString(sHelpStyleSheet);
            break;

        }
	}

	PutProperties( aNames, aValues );

	implSaveURLCounters();
}

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

void SvtHelpOptions_Impl::Notify( const Sequence<rtl::OUString>& aPropertyNames )
{
    Load( aPropertyNames );
}

SvtHelpOptions::SvtHelpOptions()
{
    // Global access, must be guarded (multithreading)
    ::osl::MutexGuard aGuard( SvtHelpOptions_Impl::getInitMutex() );
    ++nRefCount;
    if ( !pOptions )
    {
        RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtHelpOptions_Impl::ctor()");
        pOptions = new SvtHelpOptions_Impl;
        
        ItemHolder2::holdConfigItem(E_HELPOPTIONS);
    }
    pImp = pOptions;
}

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

sal_Int32 SvtHelpOptions_Impl::getAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);
	ConstMapString2IntIterator aMapPos = aURLIgnoreCounters.find(_rURL);
	if (aURLIgnoreCounters.end() == aMapPos)
		return GetHelpAgentRetryLimit();
	return aMapPos->second;
}

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

void SvtHelpOptions_Impl::decAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);
	MapString2IntIterator aMapPos = aURLIgnoreCounters.find(_rURL);
	if (aURLIgnoreCounters.end() == aMapPos)
	{	// nothing known about this URL 'til now
		sal_Int32 nLimit = GetHelpAgentRetryLimit();
		sal_Int32 nIgnoreAgain = nLimit > 0 ? nLimit - 1 : 0;
		aURLIgnoreCounters[_rURL] = nIgnoreAgain;
	}
	else
	{
		sal_Int32& rCounter = aMapPos->second;
		if (rCounter)
			--rCounter;
	}
	SetModified();
}

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

void SvtHelpOptions_Impl::resetAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);
	MapString2IntIterator aMapPos = aURLIgnoreCounters.find(_rURL);
	if (aURLIgnoreCounters.end() != aMapPos)
	{
		aURLIgnoreCounters.erase(aMapPos);
		SetModified();
	}
}

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

void SvtHelpOptions_Impl::resetAgentIgnoreURLCounter()
{
	::osl::MutexGuard aGuard(aIgnoreCounterSafety);
	aURLIgnoreCounters.clear();
	SetModified();
}

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

SvtHelpOptions::~SvtHelpOptions()
{
    // Global access, must be guarded (multithreading)
    ::osl::MutexGuard aGuard( SvtHelpOptions_Impl::getInitMutex() );
    if ( !--nRefCount )
	{
		if ( pOptions->IsModified() )
			pOptions->Commit();
        DELETEZ( pOptions );
	}
}

void SvtHelpOptions::SetExtendedHelp( sal_Bool b )
{
    pImp->SetExtendedHelp( b );
}

sal_Bool SvtHelpOptions::IsExtendedHelp() const
{
    return pImp->IsExtendedHelp();
}

void SvtHelpOptions::SetHelpTips( sal_Bool b )
{
    pImp->SetHelpTips( b );
}

sal_Bool SvtHelpOptions::IsHelpTips() const
{
    return pImp->IsHelpTips();
}

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

void SvtHelpOptions::SetHelpAgentRetryLimit( sal_Int32 _nTrials )
{
    pImp->SetHelpAgentRetryLimit( _nTrials );
}

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

sal_Int32 SvtHelpOptions::GetHelpAgentRetryLimit( ) const
{
    return pImp->GetHelpAgentRetryLimit( );
}

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

void SvtHelpOptions::SetHelpAgentTimeoutPeriod( sal_Int32 _nSeconds )
{
    pImp->SetHelpAgentTimeoutPeriod( _nSeconds );
}

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

sal_Int32 SvtHelpOptions::GetHelpAgentTimeoutPeriod( ) const
{
    return pImp->GetHelpAgentTimeoutPeriod( );
}

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

void SvtHelpOptions::SetHelpAgentAutoStartMode( sal_Bool b )
{
    pImp->SetHelpAgentEnabled( b );
}

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

sal_Bool SvtHelpOptions::IsHelpAgentAutoStartMode() const
{
    return pImp->IsHelpAgentEnabled();
}

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

sal_Int32 SvtHelpOptions::getAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	return pImp->getAgentIgnoreURLCounter( _rURL );
}

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

void SvtHelpOptions::decAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	pImp->decAgentIgnoreURLCounter( _rURL );
}

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

void SvtHelpOptions::resetAgentIgnoreURLCounter( const ::rtl::OUString& _rURL )
{
	pImp->resetAgentIgnoreURLCounter( _rURL );
}

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

void SvtHelpOptions::resetAgentIgnoreURLCounter()
{
	pImp->resetAgentIgnoreURLCounter();
}

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

void SvtHelpOptions::SetWelcomeScreen( sal_Bool b )
{
    pImp->SetWelcomeScreen( b );
}

sal_Bool SvtHelpOptions::IsWelcomeScreen() const
{
    return pImp->IsWelcomeScreen();
}

IdList* SvtHelpOptions::GetPIStarterList()
{
    return pImp->GetPIStarterList();
}

void SvtHelpOptions::AddToPIStarterList( sal_Int32 )
{
}

void SvtHelpOptions::RemoveFromPIStarterList( sal_Int32 )
{
}

String SvtHelpOptions::GetLocale() const
{
    return pImp->GetLocale();
}

String SvtHelpOptions::GetSystem() const
{
    return pImp->GetSystem();
}

const String&   SvtHelpOptions::GetHelpStyleSheet()const
{
    return pImp->GetHelpStyleSheet();
}

void  SvtHelpOptions::SetHelpStyleSheet(const String& rStyleSheet)
{
    pImp->SetHelpStyleSheet(rStyleSheet);
}

