diff options
Diffstat (limited to 'comphelper/source/officeinstdir')
-rw-r--r-- | comphelper/source/officeinstdir/officeinstallationdirectories.cxx | 249 | ||||
-rw-r--r-- | comphelper/source/officeinstdir/officeinstallationdirectories.hxx | 75 |
2 files changed, 324 insertions, 0 deletions
diff --git a/comphelper/source/officeinstdir/officeinstallationdirectories.cxx b/comphelper/source/officeinstdir/officeinstallationdirectories.cxx new file mode 100644 index 000000000..4cb3eb5e3 --- /dev/null +++ b/comphelper/source/officeinstdir/officeinstallationdirectories.cxx @@ -0,0 +1,249 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <config_folders.h> + +#include <cppuhelper/supportsservice.hxx> + +/************************************************************************** + TODO + ************************************************************************** + + *************************************************************************/ + +#include <osl/file.hxx> +#include <com/sun/star/util/theMacroExpander.hpp> +#include <comphelper/fileurl.hxx> +#include <utility> + +#include "officeinstallationdirectories.hxx" + +using namespace com::sun::star; + +static bool makeCanonicalFileURL( OUString & rURL ) +{ + OSL_ENSURE(comphelper::isFileUrl(rURL), "File URL expected!"); + + OUString aNormalizedURL; + if ( osl::FileBase::getAbsoluteFileURL( OUString(), + rURL, + aNormalizedURL ) + != osl::DirectoryItem::E_None ) + return false; + + osl::DirectoryItem aDirItem; + if ( osl::DirectoryItem::get( aNormalizedURL, aDirItem ) + != osl::DirectoryItem::E_None ) + return false; + + osl::FileStatus aFileStatus( osl_FileStatus_Mask_FileURL ); + + if ( aDirItem.getFileStatus( aFileStatus ) + == osl::DirectoryItem::E_None ) + { + aNormalizedURL = aFileStatus.getFileURL(); + + if ( !aNormalizedURL.isEmpty() ) + { + if ( !aNormalizedURL.endsWith("/") ) + rURL = aNormalizedURL; + else + rURL = aNormalizedURL + .copy( 0, aNormalizedURL.getLength() - 1 ); + + return true; + } + } + return false; +} + +namespace comphelper { + +constexpr OUStringLiteral g_aOfficeBrandDirMacro(u"$(brandbaseurl)"); +constexpr OUStringLiteral g_aUserDirMacro(u"$(userdataurl)"); + +OfficeInstallationDirectories::OfficeInstallationDirectories( + uno::Reference< uno::XComponentContext > xCtx ) +: m_xCtx(std::move( xCtx )) +{ +} + + +// virtual +OfficeInstallationDirectories::~OfficeInstallationDirectories() +{ +} + + +// util::XOfficeInstallationDirectories + + +// virtual +OUString SAL_CALL +OfficeInstallationDirectories::getOfficeInstallationDirectoryURL() +{ + initDirs(); + return *m_xOfficeBrandDir; +} + + +// virtual +OUString SAL_CALL +OfficeInstallationDirectories::getOfficeUserDataDirectoryURL() +{ + initDirs(); + return *m_xUserDir; +} + + + +// virtual +OUString SAL_CALL +OfficeInstallationDirectories::makeRelocatableURL( const OUString& URL ) +{ + if ( !URL.isEmpty() ) + { + initDirs(); + + OUString aCanonicalURL( URL ); + makeCanonicalFileURL( aCanonicalURL ); + + sal_Int32 nIndex = aCanonicalURL.indexOf( *m_xOfficeBrandDir ); + if ( nIndex != -1 ) + { + return + aCanonicalURL.replaceAt( nIndex, + m_xOfficeBrandDir->getLength(), + g_aOfficeBrandDirMacro ); + } + else + { + nIndex = aCanonicalURL.indexOf( *m_xUserDir ); + if ( nIndex != -1 ) + { + return + aCanonicalURL.replaceAt( nIndex, + m_xUserDir->getLength(), + g_aUserDirMacro ); + } + } + } + return URL; +} + + +// virtual +OUString SAL_CALL +OfficeInstallationDirectories::makeAbsoluteURL( const OUString& URL ) +{ + if ( !URL.isEmpty() ) + { + sal_Int32 nIndex = URL.indexOf( g_aOfficeBrandDirMacro ); + if ( nIndex != -1 ) + { + initDirs(); + + return + URL.replaceAt( nIndex, + g_aOfficeBrandDirMacro.getLength(), + *m_xOfficeBrandDir ); + } + else + { + nIndex = URL.indexOf( g_aUserDirMacro ); + if ( nIndex != -1 ) + { + initDirs(); + + return + URL.replaceAt( nIndex, + g_aUserDirMacro.getLength(), + *m_xUserDir ); + } + } + } + return URL; +} + + +// lang::XServiceInfo + + +// virtual +OUString SAL_CALL +OfficeInstallationDirectories::getImplementationName() +{ + return "com.sun.star.comp.util.OfficeInstallationDirectories"; +} + +// virtual +sal_Bool SAL_CALL +OfficeInstallationDirectories::supportsService( const OUString& ServiceName ) +{ + return cppu::supportsService(this, ServiceName); +} + +// virtual +uno::Sequence< OUString > SAL_CALL +OfficeInstallationDirectories::getSupportedServiceNames() +{ + return { "com.sun.star.util.OfficeInstallationDirectories" }; +} + +void OfficeInstallationDirectories::initDirs() +{ + if ( m_xOfficeBrandDir) + return; + + osl::MutexGuard aGuard( m_aMutex ); + if ( m_xOfficeBrandDir ) + return; + + uno::Reference< util::XMacroExpander > xExpander = util::theMacroExpander::get(m_xCtx); + + m_xOfficeBrandDir = xExpander->expandMacros( "$BRAND_BASE_DIR" ); + + OSL_ENSURE( !m_xOfficeBrandDir->isEmpty(), + "Unable to obtain office brand installation directory!" ); + + makeCanonicalFileURL( *m_xOfficeBrandDir ); + + m_xUserDir = + xExpander->expandMacros( + "${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE( "bootstrap" ) ":UserInstallation}" ); + + OSL_ENSURE( !m_xUserDir->isEmpty(), + "Unable to obtain office user data directory!" ); + + makeCanonicalFileURL( *m_xUserDir ); +} + +} + + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * +com_sun_star_comp_util_OfficeInstallationDirectories( + css::uno::XComponentContext *context, + css::uno::Sequence<css::uno::Any> const &) +{ + return cppu::acquire( + new comphelper::OfficeInstallationDirectories(context)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/comphelper/source/officeinstdir/officeinstallationdirectories.hxx b/comphelper/source/officeinstdir/officeinstallationdirectories.hxx new file mode 100644 index 000000000..cc0881c23 --- /dev/null +++ b/comphelper/source/officeinstdir/officeinstallationdirectories.hxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#pragma once + +#include <cppuhelper/implbase.hxx> +#include <cppuhelper/basemutex.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/util/XOfficeInstallationDirectories.hpp> + +#include <optional> + +namespace com::sun::star::uno { class XComponentContext; } + +namespace comphelper { + + + +typedef cppu::WeakImplHelper< + css::util::XOfficeInstallationDirectories, + css::lang::XServiceInfo > UnoImplBase; + +class OfficeInstallationDirectories : public cppu::BaseMutex, public UnoImplBase +{ +public: + explicit OfficeInstallationDirectories( + css::uno::Reference< css::uno::XComponentContext > xCtx ); + virtual ~OfficeInstallationDirectories() override; + + // XOfficeInstallationDirectories + virtual OUString SAL_CALL + getOfficeInstallationDirectoryURL() override; + virtual OUString SAL_CALL + getOfficeUserDataDirectoryURL() override; + virtual OUString SAL_CALL + makeRelocatableURL( const OUString& URL ) override; + virtual OUString SAL_CALL + makeAbsoluteURL( const OUString& URL ) override; + + // XServiceInfo + virtual OUString SAL_CALL + getImplementationName() override; + virtual sal_Bool SAL_CALL + supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL + getSupportedServiceNames() override; + +private: + void initDirs(); + + css::uno::Reference< css::uno::XComponentContext > m_xCtx; + std::optional<OUString> m_xOfficeBrandDir; + std::optional<OUString> m_xUserDir; +}; + +} // namespace comphelper + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |