Files
libreoffice/unotools/source/config/accelcfg.cxx
2011-12-20 15:23:34 -05:00

233 lines
7.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include "rtl/instance.hxx"
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/io/XActiveDataSource.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <com/sun/star/io/XOutputStream.hpp>
#include <com/sun/star/xml/sax/XParser.hpp>
#include <unotools/configmgr.hxx>
#include <unotools/configitem.hxx>
#include <tools/debug.hxx>
#include <osl/mutex.hxx>
#include <tools/string.hxx>
#include <tools/urlobj.hxx>
#include <unotools/streamwrap.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <comphelper/processfactory.hxx>
#include <unotools/accelcfg.hxx>
#include <unotools/xmlaccelcfg.hxx>
#include <unotools/pathoptions.hxx>
#include "itemholder1.hxx"
using namespace utl;
using namespace com::sun::star::uno;
using namespace com::sun::star::io;
using namespace com::sun::star::xml::sax;
using ::rtl::OUString;
static SvtAcceleratorConfig_Impl* pOptions = NULL;
static sal_Int32 nRefCount = 0;
class SvtAcceleratorConfig_Impl
{
public:
SvtAcceleratorItemList aList;
bool bModified;
SvtAcceleratorConfig_Impl()
: bModified( sal_False )
{}
SvtAcceleratorConfig_Impl( Reference< XInputStream >& xInputStream );
bool Commit( Reference< XOutputStream >& xOutputStream );
};
// -----------------------------------------------------------------------
SvtAcceleratorConfig_Impl::SvtAcceleratorConfig_Impl( Reference< XInputStream >& rInputStream )
: bModified( false )
{
Reference< XParser > xParser( ::comphelper::getProcessServiceFactory()->createInstance(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Parser"))),
UNO_QUERY);
// connect stream to input stream to the parser
InputSource aInputSource;
aInputSource.aInputStream = rInputStream;
// get filter
Reference< XDocumentHandler > xFilter( new OReadAccelatorDocumentHandler( aList ));
// connect parser and filter
xParser->setDocumentHandler( xFilter );
xParser->parseStream( aInputSource );
}
bool SvtAcceleratorConfig_Impl::Commit( Reference< XOutputStream >& rOutputStream )
{
Reference< XDocumentHandler > xWriter;
xWriter = Reference< XDocumentHandler >( ::comphelper::getProcessServiceFactory()->createInstance(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer"))), UNO_QUERY) ;
Reference< ::com::sun::star::io::XActiveDataSource> xDataSource( xWriter , UNO_QUERY );
xDataSource->setOutputStream( rOutputStream );
try
{
OWriteAccelatorDocumentHandler aWriteHandler( aList, xWriter );
aWriteHandler.WriteAcceleratorDocument();
rOutputStream->flush();
return true;
}
catch ( RuntimeException& )
{
}
catch ( SAXException& )
{
}
catch ( ::com::sun::star::io::IOException& )
{
}
return false;
}
namespace
{
class LocalSingleton : public rtl::Static< osl::Mutex, LocalSingleton >
{
};
}
SvtAcceleratorConfiguration::SvtAcceleratorConfiguration()
{
// Global access, must be guarded (multithreading)
::osl::MutexGuard aGuard( LocalSingleton::get() );
if ( !pOptions )
{
SvStream* pStream = GetDefaultStream( STREAM_STD_READ );
::utl::OInputStreamWrapper aHelper( *pStream );
com::sun::star::uno::Reference < ::com::sun::star::io::XInputStream > xOut( &aHelper );
try
{
pOptions = new SvtAcceleratorConfig_Impl( xOut );
}
catch ( RuntimeException& )
{
pOptions = new SvtAcceleratorConfig_Impl();
}
catch( SAXException& )
{
pOptions = new SvtAcceleratorConfig_Impl();
}
catch( ::com::sun::star::io::IOException& )
{
pOptions = new SvtAcceleratorConfig_Impl();
}
if (pOptions)
ItemHolder1::holdConfigItem(E_ACCELCFG);
delete pStream;
}
++nRefCount;
pImp = pOptions;
}
// -----------------------------------------------------------------------
SvtAcceleratorConfiguration::~SvtAcceleratorConfiguration()
{
if ( pImp == pOptions )
{
// Global access, must be guarded (multithreading)
::osl::MutexGuard aGuard( LocalSingleton::get() );
if ( !--nRefCount )
{
if ( pImp->bModified )
{
String aUserConfig = SvtPathOptions().GetUserConfigPath();
INetURLObject aObj( aUserConfig );
aObj.insertName( String::CreateFromAscii("GlobalKeyBindings.xml") );
SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( aObj.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE|STREAM_TRUNC );
::utl::OOutputStreamWrapper aHelper( *pStream );
com::sun::star::uno::Reference < ::com::sun::star::io::XOutputStream > xOut( &aHelper );
pImp->Commit( xOut );
delete pStream;
}
DELETEZ( pOptions );
}
}
else
{
delete pImp;
}
}
void SvtAcceleratorConfiguration::SetCommand( const SvtAcceleratorConfigItem& rItem )
{
std::list< SvtAcceleratorConfigItem>::iterator p;
for ( p = pImp->aList.begin(); p != pImp->aList.end(); ++p )
if ( p->nCode == rItem.nCode && p->nModifier == rItem.nModifier )
{
p->aCommand = rItem.aCommand;
return;
}
pImp->aList.push_back( rItem );
}
String SvtAcceleratorConfiguration::GetStreamName()
{
return String::CreateFromAscii("KeyBindings.xml");
}
SvStream* SvtAcceleratorConfiguration::GetDefaultStream( StreamMode nMode )
{
String aUserConfig = SvtPathOptions().GetUserConfigPath();
INetURLObject aObj( aUserConfig );
aObj.insertName( GetStreamName() );
return ::utl::UcbStreamHelper::CreateStream( aObj.GetMainURL( INetURLObject::NO_DECODE ), nMode );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */