Files
libreoffice/ucb/source/ucp/expand/ucpexpand.cxx
Matúš Kukan f1493c583f ucb: add component prefixes
Change-Id: I77bb24d90d310452530abe57ebc183cce98043de
2012-09-01 21:06:10 +02:00

281 lines
9.1 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/uri.hxx"
#include "osl/mutex.hxx"
#include "cppuhelper/compbase2.hxx"
#include "cppuhelper/factory.hxx"
#include "cppuhelper/implementationentry.hxx"
#include "ucbhelper/content.hxx"
#include "com/sun/star/uno/XComponentContext.hpp"
#include "com/sun/star/lang/DisposedException.hpp"
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
#include "com/sun/star/registry/XRegistryKey.hpp"
#include "com/sun/star/util/XMacroExpander.hpp"
#include "com/sun/star/ucb/XContentProvider.hpp"
#define EXPAND_PROTOCOL "vnd.sun.star.expand"
#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
#define ARLEN(x) sizeof (x) / sizeof *(x)
using namespace ::com::sun::star;
using ::rtl::OUString;
namespace
{
struct MutexHolder
{
mutable ::osl::Mutex m_mutex;
};
typedef ::cppu::WeakComponentImplHelper2<
lang::XServiceInfo, ucb::XContentProvider > t_impl_helper;
//==============================================================================
class ExpandContentProviderImpl : protected MutexHolder, public t_impl_helper
{
uno::Reference< util::XMacroExpander > m_xMacroExpander;
OUString expandUri(
uno::Reference< ucb::XContentIdentifier > const & xIdentifier ) const;
protected:
inline void check() const;
virtual void SAL_CALL disposing();
public:
inline ExpandContentProviderImpl(
uno::Reference< uno::XComponentContext > const & xComponentContext )
: t_impl_helper( m_mutex ),
m_xMacroExpander(
xComponentContext->getValueByName(
OUSTR("/singletons/com.sun.star.util.theMacroExpander") ),
uno::UNO_QUERY_THROW )
{}
virtual ~ExpandContentProviderImpl() throw ();
// XServiceInfo
virtual OUString SAL_CALL getImplementationName()
throw (uno::RuntimeException);
virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName )
throw (uno::RuntimeException);
virtual uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
throw (uno::RuntimeException);
// XContentProvider
virtual uno::Reference< ucb::XContent > SAL_CALL queryContent(
uno::Reference< ucb::XContentIdentifier > const & xIdentifier )
throw (ucb::IllegalIdentifierException, uno::RuntimeException);
virtual sal_Int32 SAL_CALL compareContentIds(
uno::Reference< ucb::XContentIdentifier > const & xId1,
uno::Reference< ucb::XContentIdentifier > const & xId2 )
throw (uno::RuntimeException);
};
//______________________________________________________________________________
inline void ExpandContentProviderImpl::check() const
{
// xxx todo guard?
// MutexGuard guard( m_mutex );
if (rBHelper.bInDispose || rBHelper.bDisposed)
{
throw lang::DisposedException(
OUSTR("expand content provider instance has "
"already been disposed!"),
static_cast< OWeakObject * >(
const_cast< ExpandContentProviderImpl * >(this) ) );
}
}
//______________________________________________________________________________
ExpandContentProviderImpl::~ExpandContentProviderImpl() throw ()
{
}
//______________________________________________________________________________
void ExpandContentProviderImpl::disposing()
{
}
//==============================================================================
static uno::Reference< uno::XInterface > SAL_CALL create(
uno::Reference< uno::XComponentContext > const & xComponentContext )
SAL_THROW( (uno::Exception) )
{
return static_cast< ::cppu::OWeakObject * >(
new ExpandContentProviderImpl( xComponentContext ) );
}
//==============================================================================
static OUString SAL_CALL implName()
{
return OUSTR("com.sun.star.comp.ucb.ExpandContentProvider");
}
//==============================================================================
static uno::Sequence< OUString > SAL_CALL supportedServices()
{
OUString names [] = {
OUSTR("com.sun.star.ucb.ExpandContentProvider"),
OUSTR("com.sun.star.ucb.ContentProvider")
};
return uno::Sequence< OUString >( names, ARLEN(names) );
}
// XServiceInfo
//______________________________________________________________________________
OUString ExpandContentProviderImpl::getImplementationName()
throw (uno::RuntimeException)
{
check();
return implName();
}
//______________________________________________________________________________
uno::Sequence< OUString > ExpandContentProviderImpl::getSupportedServiceNames()
throw (uno::RuntimeException)
{
check();
return supportedServices();
}
//______________________________________________________________________________
sal_Bool ExpandContentProviderImpl::supportsService(
OUString const & serviceName )
throw (uno::RuntimeException)
{
// check();
uno::Sequence< OUString > supported_services( getSupportedServiceNames() );
OUString const * ar = supported_services.getConstArray();
for ( sal_Int32 pos = supported_services.getLength(); pos--; )
{
if (ar[ pos ].equals( serviceName ))
return true;
}
return false;
}
//______________________________________________________________________________
OUString ExpandContentProviderImpl::expandUri(
uno::Reference< ucb::XContentIdentifier > const & xIdentifier ) const
{
OUString uri( xIdentifier->getContentIdentifier() );
if (uri.compareToAscii(
RTL_CONSTASCII_STRINGPARAM(EXPAND_PROTOCOL ":") ) != 0)
{
throw ucb::IllegalIdentifierException(
OUSTR("expected protocol " EXPAND_PROTOCOL "!"),
static_cast< OWeakObject * >(
const_cast< ExpandContentProviderImpl * >(this) ) );
}
// cut protocol
OUString str( uri.copy( sizeof (EXPAND_PROTOCOL ":") -1 ) );
// decode uric class chars
str = ::rtl::Uri::decode(
str, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
// expand macro string
return m_xMacroExpander->expandMacros( str );
}
// XContentProvider
//______________________________________________________________________________
uno::Reference< ucb::XContent > ExpandContentProviderImpl::queryContent(
uno::Reference< ucb::XContentIdentifier > const & xIdentifier )
throw (ucb::IllegalIdentifierException, uno::RuntimeException)
{
check();
OUString uri( expandUri( xIdentifier ) );
::ucbhelper::Content ucb_content;
if (::ucbhelper::Content::create(
uri, uno::Reference< ucb::XCommandEnvironment >(), ucb_content ))
{
return ucb_content.get();
}
else
{
return uno::Reference< ucb::XContent >();
}
}
//______________________________________________________________________________
sal_Int32 ExpandContentProviderImpl::compareContentIds(
uno::Reference< ucb::XContentIdentifier > const & xId1,
uno::Reference< ucb::XContentIdentifier > const & xId2 )
throw (uno::RuntimeException)
{
check();
try
{
OUString uri1( expandUri( xId1 ) );
OUString uri2( expandUri( xId2 ) );
return uri1.compareTo( uri2 );
}
catch (const ucb::IllegalIdentifierException & exc)
{
(void) exc; // unused
OSL_FAIL(
::rtl::OUStringToOString(
exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
return -1;
}
}
static const ::cppu::ImplementationEntry s_entries [] =
{
{
create,
implName,
supportedServices,
::cppu::createSingleComponentFactory,
0, 0
},
{ 0, 0, 0, 0, 0, 0 }
};
}
extern "C"
{
SAL_DLLPUBLIC_EXPORT void * SAL_CALL ucpexpand1_component_getFactory(
const sal_Char * pImplName,
lang::XMultiServiceFactory * pServiceManager,
registry::XRegistryKey * pRegistryKey )
{
return ::cppu::component_getFactoryHelper(
pImplName, pServiceManager, pRegistryKey, s_entries );
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */