diff --git a/extensions/source/resource/ResourceIndexAccess.cxx b/extensions/source/resource/ResourceIndexAccess.cxx new file mode 100644 index 000000000000..31a244b96a5f --- /dev/null +++ b/extensions/source/resource/ResourceIndexAccess.cxx @@ -0,0 +1,208 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Bjoern Michaelsen + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Major Contributor(s): + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::extensions::resource; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; + +using ::comphelper::stl_begin; +using ::comphelper::stl_end; +using ::rtl::OString; +using ::rtl::OUString; +using ::rtl::OUStringToOString; + +namespace +{ + static ::boost::shared_ptr GetResMgr(Sequence const& rArgs) + { + if(rArgs.getLength()!=1) + return ::boost::shared_ptr(); + OUString sFilename; + rArgs[0] >>= sFilename; + SolarMutexGuard aGuard; + const OString sEncName(OUStringToOString(sFilename, osl_getThreadTextEncoding())); + return ::boost::shared_ptr(ResMgr::CreateResMgr(sEncName)); + } + + class ResourceIndexAccessBase : public cppu::WeakImplHelper1< ::com::sun::star::container::XIndexAccess> + { + public: + ResourceIndexAccessBase( ::boost::shared_ptr pResMgr) + : m_pResMgr(pResMgr) + { + OSL_ENSURE(m_pResMgr, "no ressource manager given"); + } + + // XIndexAccess + virtual ::sal_Int32 SAL_CALL getCount( ) throw (::com::sun::star::uno::RuntimeException) + { return m_pResMgr.get() ? SAL_MAX_UINT16 : 0; }; + // XElementAccess + virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException) + { return static_cast(m_pResMgr.get()); }; + + protected: + // m_pResMgr should never be NULL + const ::boost::shared_ptr m_pResMgr; + }; + + class ResourceStringIndexAccess : public ResourceIndexAccessBase + { + public: + ResourceStringIndexAccess( ::boost::shared_ptr pResMgr) + : ResourceIndexAccessBase(pResMgr) {} + // XIndexAccess + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + // XElementAccessBase + virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException) + { return ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)); }; + }; + + class ResourceStringListIndexAccess : public ResourceIndexAccessBase + { + public: + ResourceStringListIndexAccess( ::boost::shared_ptr pResMgr) + : ResourceIndexAccessBase(pResMgr) {} + // XIndexAccess + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + // XElementAccessBase + virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException) + { return ::getCppuType(reinterpret_cast * >(NULL)); }; + }; +} + +ResourceIndexAccess::ResourceIndexAccess(Sequence const& rArgs, Reference const&) + : m_pResMgr(GetResMgr(rArgs)) +{}; + +Reference initResourceIndexAccess(ResourceIndexAccess* pResourceIndexAccess) +{ + Reference xResult(static_cast(pResourceIndexAccess)); + if(!pResourceIndexAccess->hasElements()) + // xResult does not help the client to analyse the problem + // and will crash on getByIndex calls, better just give back an empty Reference + // so that such ResourceStringIndexAccess instances are never release into the wild + throw RuntimeException( + OUString(RTL_CONSTASCII_USTRINGPARAM("ressource manager could not get initialized")), + /* xResult */ Reference()); + return xResult; +} + +Any SAL_CALL ResourceIndexAccess::getByName(const OUString& aName) + throw (NoSuchElementException, WrappedTargetException, RuntimeException) +{ + const Sequence aNames(getElementNames()); + Reference xResult; + switch(::std::find(stl_begin(aNames), stl_end(aNames), aName)-stl_begin(aNames)) + { + case 0: + xResult = Reference(new ResourceStringIndexAccess(m_pResMgr)); + break; + case 1: + xResult = Reference(new ResourceStringListIndexAccess(m_pResMgr)); + break; + default: + throw NoSuchElementException(); + } + return makeAny(xResult); +} + +Sequence SAL_CALL ResourceIndexAccess::getElementNames( ) + throw (RuntimeException) +{ + static Sequence aResult; + if( aResult.getLength() == 0) + { + aResult.realloc(2); + aResult[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("String")); + aResult[1] = OUString(RTL_CONSTASCII_USTRINGPARAM("StringList")); + } + return aResult; +} + +::sal_Bool SAL_CALL ResourceIndexAccess::hasByName(const OUString& aName) + throw (RuntimeException) +{ + const Sequence aNames(getElementNames()); + return (::std::find(stl_begin(aNames), stl_end(aNames), aName) != stl_end(aNames)); +} + +Any SAL_CALL ResourceStringIndexAccess::getByIndex(sal_Int32 nIdx) + throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException) +{ + if(nIdx > SAL_MAX_UINT16 || nIdx < 0) + throw IndexOutOfBoundsException(); + SolarMutexGuard aGuard; + const ResId aId(static_cast(nIdx), *m_pResMgr); + aId.SetRT(RSC_STRING); + if(!m_pResMgr->IsAvailable(aId)) + throw RuntimeException( + OUString(RTL_CONSTASCII_USTRINGPARAM("string ressource for id not available")), + Reference()); + return makeAny(OUString(String(aId))); +} + +Any SAL_CALL ResourceStringListIndexAccess::getByIndex(sal_Int32 nIdx) + throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException) +{ + if(nIdx > SAL_MAX_UINT16 || nIdx < 0) + throw IndexOutOfBoundsException(); + SolarMutexGuard aGuard; + const ResId aId(static_cast(nIdx), *m_pResMgr); + aId.SetRT(RSC_STRINGARRAY); + if(!m_pResMgr->IsAvailable(aId)) + throw RuntimeException( + OUString(RTL_CONSTASCII_USTRINGPARAM("string list ressource for id not available")), + Reference()); + const ResStringArray aStringList(aId); + Sequence aPropList(aStringList.Count()); + for(sal_Int32 nCount = 0; nCount != aPropList.getLength(); ++nCount) + { + aPropList[nCount].Name = aStringList.GetString(nCount); + aPropList[nCount].Handle = -1; + aPropList[nCount].Value <<= aStringList.GetValue(nCount); + aPropList[nCount].State = PropertyState_DIRECT_VALUE; + } + return makeAny(aPropList); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/extensions/source/resource/ResourceStringIndexAccess.hxx b/extensions/source/resource/ResourceIndexAccess.hxx similarity index 56% rename from extensions/source/resource/ResourceStringIndexAccess.hxx rename to extensions/source/resource/ResourceIndexAccess.hxx index e1a01e3a5de0..41632591aa10 100644 --- a/extensions/source/resource/ResourceStringIndexAccess.hxx +++ b/extensions/source/resource/ResourceIndexAccess.hxx @@ -33,39 +33,43 @@ #include "precompiled_extensions.hxx" -#include +#include +#include #include #include #include #include -#include class ResMgr; namespace extensions { namespace resource { - class ResourceStringIndexAccess : public cppu::WeakImplHelper1< ::com::sun::star::container::XIndexAccess> + /** This class provides access to tools library text resources */ + class ResourceIndexAccess : public cppu::WeakImplHelper1< ::com::sun::star::container::XNameAccess> { public: - ResourceStringIndexAccess(::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any> const& rArgs, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext> const&); - // XIndexAccess - virtual ::sal_Int32 SAL_CALL getCount( ) throw (::com::sun::star::uno::RuntimeException) - { return m_pResMgr.get() ? SAL_MAX_UINT16 : 0; }; - virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + /** The ctor takes a sequence with one element: the name of the resource, e.g. svt */ + ResourceIndexAccess(::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any> const& rArgs, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext> const&); + // XNameAccess + // The XNameAccess provides access to two named elements: + // "String" returns a XIndexAccess to String resources + // "StringList" returns a XIndexAccess to StringList/StringArray resources + virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException); // XElementAccess virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException) - { return ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)); }; + { return ::getCppuType(reinterpret_cast< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>*>(NULL)); }; virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException) { return static_cast(m_pResMgr.get()); }; private: - // m_pResMgr should never be NULL, see initResourceStringIndexAccess - const ::std::auto_ptr m_pResMgr; + // m_pResMgr should never be NULL + const ::boost::shared_ptr m_pResMgr; }; - }} -::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> initResourceStringIndexAccess(::extensions::resource::ResourceStringIndexAccess*); +::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> initResourceIndexAccess(::extensions::resource::ResourceIndexAccess*); #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/extensions/source/resource/ResourceStringIndexAccess.cxx b/extensions/source/resource/ResourceStringIndexAccess.cxx deleted file mode 100644 index d48d636bfa11..000000000000 --- a/extensions/source/resource/ResourceStringIndexAccess.cxx +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * Version: MPL 1.1 / GPLv3+ / LGPLv3+ - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License or as specified alternatively below. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Initial Developer of the Original Code is - * Bjoern Michaelsen - * Portions created by the Initial Developer are Copyright (C) 2010 the - * Initial Developer. All Rights Reserved. - * - * Major Contributor(s): - * - * For minor contributions see the git repository. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 3 or later (the "GPLv3+"), or - * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), - * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable - * instead of those above. - */ - -#include - -#include -#include -#include -#include -#include - -using namespace ::extensions::resource; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; - -using ::rtl::OUString; -using ::rtl::OString; -using ::rtl::OUStringToOString; - -namespace -{ - static ::std::auto_ptr GetResMgr(Sequence const& rArgs) - { - if(rArgs.getLength()!=1) - return ::std::auto_ptr(); - OUString sFilename; - rArgs[0] >>= sFilename; - SolarMutexGuard aGuard; - const OString sEncName(OUStringToOString(sFilename, osl_getThreadTextEncoding())); - return ::std::auto_ptr(ResMgr::CreateResMgr(sEncName)); - } -} - - -ResourceStringIndexAccess::ResourceStringIndexAccess(Sequence const& rArgs, Reference const&) - : m_pResMgr(GetResMgr(rArgs)) -{}; - -Reference initResourceStringIndexAccess(ResourceStringIndexAccess* pResourceStringIndexAccess) -{ - Reference xResult(static_cast(pResourceStringIndexAccess)); - if(!pResourceStringIndexAccess->hasElements()) - // xResult does not help the client to analyse the problem - // and will crash on getByIndex calls, better just give back an empty Reference - // so that such ResourceStringIndexAccess instances are never release into the wild - throw RuntimeException( - OUString(RTL_CONSTASCII_USTRINGPARAM("ressource manager could not get initialized")), - /* xResult */ Reference()); - return xResult; -} - -Any SAL_CALL ResourceStringIndexAccess::getByIndex(sal_Int32 nIdx) - throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - if(nIdx > SAL_MAX_UINT16 || nIdx < 0) - throw IndexOutOfBoundsException(); - SolarMutexGuard aGuard; - const ResId aId(static_cast(nIdx), *m_pResMgr); - aId.SetRT(RSC_STRING); - if(!m_pResMgr->IsAvailable(aId)) - throw RuntimeException( - OUString(RTL_CONSTASCII_USTRINGPARAM("string ressource for id not available")), - Reference()); - return makeAny(OUString(String(aId))); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/extensions/source/resource/makefile.mk b/extensions/source/resource/makefile.mk index d9143d2d37be..4839ec0b7ca2 100644 --- a/extensions/source/resource/makefile.mk +++ b/extensions/source/resource/makefile.mk @@ -40,7 +40,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- SLOFILES= \ - $(SLO)$/ResourceStringIndexAccess.obj \ + $(SLO)$/ResourceIndexAccess.obj \ $(SLO)$/oooresourceloader.obj \ $(SLO)$/resourceservices.obj diff --git a/extensions/source/resource/res.component b/extensions/source/resource/res.component index 36227874216d..b5df9748e464 100644 --- a/extensions/source/resource/res.component +++ b/extensions/source/resource/res.component @@ -32,7 +32,7 @@ - - + + diff --git a/extensions/source/resource/resourceservices.cxx b/extensions/source/resource/resourceservices.cxx index 1ed27148ab9d..0a08bb52666a 100644 --- a/extensions/source/resource/resourceservices.cxx +++ b/extensions/source/resource/resourceservices.cxx @@ -30,20 +30,20 @@ #include "precompiled_extensions.hxx" -#include +#include #include #include #include namespace sdecl = ::comphelper::service_decl; -sdecl::class_< ::extensions::resource::ResourceStringIndexAccess, sdecl::with_args > ResourceStringIndexAccessServiceImpl; +sdecl::class_< ::extensions::resource::ResourceIndexAccess, sdecl::with_args > ResourceIndexAccessServiceImpl; sdecl::class_< ::extensions::resource::OpenOfficeResourceLoader> OpenOfficeResourceLoaderServiceImpl; -const sdecl::ServiceDecl ResourceStringIndexAccessDecl( - ResourceStringIndexAccessServiceImpl, - "org.libreoffice.extensions.resource.ResourceStringIndexAccess", - "org.libreoffice.resource.ResourceStringIndexAccess"); +const sdecl::ServiceDecl ResourceIndexAccessDecl( + ResourceIndexAccessServiceImpl, + "org.libreoffice.extensions.resource.ResourceIndexAccess", + "org.libreoffice.resource.ResourceIndexAccess"); const sdecl::ServiceDecl OpenOfficeResourceLoaderDecl( OpenOfficeResourceLoaderServiceImpl, @@ -51,7 +51,7 @@ const sdecl::ServiceDecl OpenOfficeResourceLoaderDecl( "com.sun.star.resource.OfficeResourceLoader"); COMPHELPER_SERVICEDECL_EXPORTS2( - ResourceStringIndexAccessDecl, + ResourceIndexAccessDecl, OpenOfficeResourceLoaderDecl );