summaryrefslogtreecommitdiff
path: root/framework/source/services
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@collabora.com>2014-01-09 19:36:11 +0100
committerMatúš Kukan <matus.kukan@collabora.com>2014-01-30 10:48:25 +0100
commit6c15ca4d9d4a7b3116330dd0a17f7fadaed2eff4 (patch)
treed5bad1cda04d2b9737fe0b9ae22859783b07ff24 /framework/source/services
parent2257efcddebe9dc966f8fce8ab28eb2d8f0169cc (diff)
fwk: Constructor feature for single-instance SubstitutePathVariables.
Change-Id: Ibd626f00bb844ae8ec1cab773093b8c94bf8d936
Diffstat (limited to 'framework/source/services')
-rw-r--r--framework/source/services/substitutepathvars.cxx315
1 files changed, 288 insertions, 27 deletions
diff --git a/framework/source/services/substitutepathvars.cxx b/framework/source/services/substitutepathvars.cxx
index a7a44f05e8fe..35db77074573 100644
--- a/framework/source/services/substitutepathvars.cxx
+++ b/framework/source/services/substitutepathvars.cxx
@@ -19,13 +19,10 @@
#include <config_folders.h>
-#include "services/substitutepathvars.hxx"
-#include <threadhelp/resetableguard.hxx>
#include <helper/networkdomain.hxx>
-#include "services.h"
-
-#include <com/sun/star/beans/XPropertySet.hpp>
+#include <cppuhelper/compbase2.hxx>
+#include <cppuhelper/supportsservice.hxx>
#include <unotools/configitem.hxx>
#include <unotools/localfilehelper.hxx>
#include <unotools/configmgr.hxx>
@@ -37,6 +34,7 @@
#include <osl/socket.hxx>
#include <osl/process.h>
#include <i18nlangtag/languagetag.hxx>
+#include <tools/link.hxx>
#include <tools/urlobj.hxx>
#include <tools/resmgr.hxx>
#include <tools/wldcrd.hxx>
@@ -45,9 +43,12 @@
#include <officecfg/Office/Paths.hxx>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/container/NoSuchElementException.hpp>
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/util/XStringSubstitution.hpp>
-
+#include <boost/unordered_map.hpp>
#include <string.h>
using namespace com::sun::star::uno;
@@ -55,13 +56,259 @@ using namespace com::sun::star::beans;
using namespace com::sun::star::util;
using namespace com::sun::star::lang;
using namespace com::sun::star::container;
+using namespace framework;
-//_________________________________________________________________________________________________________________
-// Namespace
-//_________________________________________________________________________________________________________________
+namespace {
+
+// Must be zero value based
+enum EnvironmentType
+{
+ ET_HOST = 0 ,
+ ET_YPDOMAIN ,
+ ET_DNSDOMAIN ,
+ ET_NTDOMAIN ,
+ ET_OS ,
+ ET_UNKNOWN ,
+ ET_COUNT
+};
-namespace framework
+// Must be zero value based
+enum OperatingSystem
{
+ OS_WINDOWS = 0,
+ OS_UNIX ,
+ OS_SOLARIS ,
+ OS_LINUX ,
+ OS_UNKNOWN ,
+ OS_COUNT
+};
+
+struct SubstituteRule
+{
+ SubstituteRule() {}
+ SubstituteRule( const OUString& aVarName,
+ const OUString& aValue,
+ const com::sun::star::uno::Any& aVal,
+ EnvironmentType aType ) :
+ aSubstVariable( aVarName ), aSubstValue( aValue ), aEnvValue( aVal ), aEnvType( aType ) {}
+
+ OUString aSubstVariable;
+ OUString aSubstValue;
+ com::sun::star::uno::Any aEnvValue;
+ EnvironmentType aEnvType;
+};
+
+struct SubstitutePathNotify
+{
+ SubstitutePathNotify() {};
+
+ const com::sun::star::uno::Sequence<OUString> aPropertyNames;
+};
+
+class SubstituteVariables : public ::boost::unordered_map< OUString,
+ SubstituteRule,
+ OUStringHash,
+ ::std::equal_to< OUString > >
+{
+ public:
+ inline void free()
+ {
+ SubstituteVariables().swap( *this );
+ }
+};
+
+typedef std::vector< SubstituteRule > SubstituteRuleVector;
+class SubstitutePathVariables_Impl : public utl::ConfigItem
+{
+ public:
+ SubstitutePathVariables_Impl( const Link& aNotifyLink );
+ virtual ~SubstitutePathVariables_Impl();
+
+ static OperatingSystem GetOperatingSystemFromString( const OUString& );
+ static EnvironmentType GetEnvTypeFromString( const OUString& );
+
+ void GetSharePointsRules( SubstituteVariables& aSubstVarMap );
+
+ /** is called from the ConfigManager before application ends or from the
+ PropertyChangeListener if the sub tree broadcasts changes. */
+ virtual void Notify( const com::sun::star::uno::Sequence< OUString >& aPropertyNames );
+ virtual void Commit();
+
+ private:
+ // Wrapper methods for low-level functions
+ OperatingSystem GetOperatingSystem();
+ const OUString& GetYPDomainName();
+ const OUString& GetDNSDomainName();
+ const OUString& GetNTDomainName();
+ const OUString& GetHostName();
+
+ bool FilterRuleSet( const SubstituteRuleVector& aRuleSet, SubstituteRule& aActiveRule );
+
+ void ReadSharePointsFromConfiguration( com::sun::star::uno::Sequence< OUString >& aSharePointsSeq );
+ void ReadSharePointRuleSetFromConfiguration( const OUString& aSharePointName,
+ const OUString& aSharePointNodeName,
+ SubstituteRuleVector& aRuleSet );
+
+ // Stored values for domains and host
+ bool m_bYPDomainRetrieved;
+ OUString m_aYPDomain;
+ bool m_bDNSDomainRetrieved;
+ OUString m_aDNSDomain;
+ bool m_bNTDomainRetrieved;
+ OUString m_aNTDomain;
+ bool m_bHostRetrieved;
+ OUString m_aHost;
+
+ Link m_aListenerNotify;
+ const OUString m_aSharePointsNodeName;
+ const OUString m_aDirPropertyName;
+ const OUString m_aEnvPropertyName;
+ const OUString m_aLevelSep;
+};
+
+enum PreDefVariable
+{
+ PREDEFVAR_INST,
+ PREDEFVAR_PROG,
+ PREDEFVAR_USER,
+ PREDEFVAR_WORK,
+ PREDEFVAR_HOME,
+ PREDEFVAR_TEMP,
+ PREDEFVAR_PATH,
+ PREDEFVAR_LANG,
+ PREDEFVAR_LANGID,
+ PREDEFVAR_VLANG,
+ PREDEFVAR_INSTPATH,
+ PREDEFVAR_PROGPATH,
+ PREDEFVAR_USERPATH,
+ PREDEFVAR_INSTURL,
+ PREDEFVAR_PROGURL,
+ PREDEFVAR_USERURL,
+ PREDEFVAR_WORKDIRURL,
+ // New variable of hierachy service (#i32656#)
+ PREDEFVAR_BASEINSTURL,
+ PREDEFVAR_USERDATAURL,
+ PREDEFVAR_BRANDBASEURL,
+ PREDEFVAR_COUNT
+};
+
+struct PredefinedPathVariables
+{
+ // Predefined variables supported by substitute variables
+ LanguageType m_eLanguageType; // Lanuage type of Office
+ OUString m_FixedVar[ PREDEFVAR_COUNT ]; // Variable value access by PreDefVariable
+ OUString m_FixedVarNames[ PREDEFVAR_COUNT ]; // Variable name access by PreDefVariable
+};
+
+struct ReSubstFixedVarOrder
+{
+ sal_Int32 nVarValueLength;
+ PreDefVariable eVariable;
+
+ bool operator< ( const ReSubstFixedVarOrder& aFixedVarOrder ) const
+ {
+ // Reverse operator< to have high to low ordering
+ return ( nVarValueLength > aFixedVarOrder.nVarValueLength );
+ }
+};
+
+struct ReSubstUserVarOrder
+{
+ sal_Int32 nVarValueLength;
+ OUString aVarName;
+
+ bool operator< ( const ReSubstUserVarOrder& aUserVarOrder ) const
+ {
+ // Reverse operator< to have high to low ordering
+ return ( nVarValueLength > aUserVarOrder.nVarValueLength );
+ }
+};
+
+typedef std::list< ReSubstFixedVarOrder > ReSubstFixedVarOrderVector;
+typedef std::list< ReSubstUserVarOrder > ReSubstUserVarOrderVector;
+typedef ::cppu::WeakComponentImplHelper2<
+ css::util::XStringSubstitution,
+ css::lang::XServiceInfo > SubstitutePathVariables_BASE;
+
+class SubstitutePathVariables : private osl::Mutex,
+ public SubstitutePathVariables_BASE
+{
+friend class SubstitutePathVariables_Impl;
+
+public:
+ SubstitutePathVariables( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext );
+ virtual ~SubstitutePathVariables();
+
+ virtual OUString SAL_CALL getImplementationName()
+ throw (css::uno::RuntimeException)
+ {
+ return OUString("com.sun.star.comp.framework.PathSubstitution");
+ }
+
+ virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName)
+ throw (css::uno::RuntimeException)
+ {
+ return cppu::supportsService(this, ServiceName);
+ }
+
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames()
+ throw (css::uno::RuntimeException)
+ {
+ css::uno::Sequence< OUString > aSeq(1);
+ aSeq[0] = OUString("com.sun.star.util.PathSubstitution");
+ return aSeq;
+ }
+
+ // XStringSubstitution
+ virtual OUString SAL_CALL substituteVariables( const OUString& aText, sal_Bool bSubstRequired )
+ throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
+ virtual OUString SAL_CALL reSubstituteVariables( const OUString& aText )
+ throw (::com::sun::star::uno::RuntimeException);
+ virtual OUString SAL_CALL getSubstituteVariableValue( const OUString& variable )
+ throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
+
+protected:
+ DECL_LINK(implts_ConfigurationNotify, void *);
+
+ void SetPredefinedPathVariables( PredefinedPathVariables& );
+ OUString ConvertOSLtoUCBURL( const OUString& aOSLCompliantURL ) const;
+
+ // Special case (transient) values can change during runtime!
+ // Don't store them in the pre defined struct
+ OUString GetWorkPath() const;
+ OUString GetWorkVariableValue() const;
+ OUString GetPathVariableValue() const;
+
+ OUString GetHomeVariableValue() const;
+
+ // XStringSubstitution implementation methods
+ OUString impl_substituteVariable( const OUString& aText, bool bSustRequired )
+ throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
+ OUString impl_reSubstituteVariables( const OUString& aText )
+ throw (::com::sun::star::uno::RuntimeException);
+ OUString impl_getSubstituteVariableValue( const OUString& variable )
+ throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
+
+private:
+ class VarNameToIndexMap : public boost::unordered_map< OUString,
+ PreDefVariable,
+ OUStringHash,
+ ::std::equal_to< OUString > >
+ {
+ inline void free()
+ {
+ VarNameToIndexMap().swap( *this );
+ }
+ };
+
+ VarNameToIndexMap m_aPreDefVarMap; // Mapping from pre-def variable names to enum for array access
+ SubstituteVariables m_aSubstVarMap; // Active rule set map indexed by variable name!
+ PredefinedPathVariables m_aPreDefVars; // All predefined variables
+ SubstitutePathVariables_Impl m_aImpl; // Implementation class that access the configuration
+ ReSubstFixedVarOrderVector m_aReSubstFixedVarOrder; // To speed up resubstitution fixed variables (order for lookup)
+ ReSubstUserVarOrderVector m_aReSubstUserVarOrder; // To speed up resubstitution user variables
+ css::uno::Reference< css::uno::XComponentContext > m_xContext;
+};
struct FixedVariable
{
@@ -493,19 +740,8 @@ void SubstitutePathVariables_Impl::ReadSharePointRuleSetFromConfiguration(
}
}
-//*****************************************************************************************************************
-// XInterface, XTypeProvider, XServiceInfo
-//*****************************************************************************************************************
-DEFINE_XSERVICEINFO_ONEINSTANCESERVICE_2( SubstitutePathVariables ,
- ::cppu::OWeakObject ,
- "com.sun.star.util.PathSubstitution",
- IMPLEMENTATIONNAME_SUBSTITUTEPATHVARIABLES )
-
-DEFINE_INIT_SERVICE ( SubstitutePathVariables, {} )
-
-
SubstitutePathVariables::SubstitutePathVariables( const Reference< XComponentContext >& xContext ) :
- ThreadHelpBase(),
+ SubstitutePathVariables_BASE(*static_cast<osl::Mutex *>(this)),
m_aImpl( LINK( this, SubstitutePathVariables, implts_ConfigurationNotify )),
m_xContext( xContext )
{
@@ -562,21 +798,21 @@ SubstitutePathVariables::~SubstitutePathVariables()
OUString SAL_CALL SubstitutePathVariables::substituteVariables( const OUString& aText, sal_Bool bSubstRequired )
throw ( NoSuchElementException, RuntimeException )
{
- ResetableGuard aLock( m_aLock );
+ osl::MutexGuard g(rBHelper.rMutex);
return impl_substituteVariable( aText, bSubstRequired );
}
OUString SAL_CALL SubstitutePathVariables::reSubstituteVariables( const OUString& aText )
throw ( RuntimeException )
{
- ResetableGuard aLock( m_aLock );
+ osl::MutexGuard g(rBHelper.rMutex);
return impl_reSubstituteVariables( aText );
}
OUString SAL_CALL SubstitutePathVariables::getSubstituteVariableValue( const OUString& aVariable )
throw ( NoSuchElementException, RuntimeException )
{
- ResetableGuard aLock( m_aLock );
+ osl::MutexGuard g(rBHelper.rMutex);
return impl_getSubstituteVariableValue( aVariable );
}
@@ -587,7 +823,7 @@ throw ( NoSuchElementException, RuntimeException )
IMPL_LINK_NOARG(SubstitutePathVariables, implts_ConfigurationNotify)
{
/* SAFE AREA ----------------------------------------------------------------------------------------------- */
- ResetableGuard aLock( m_aLock );
+ osl::MutexGuard g(rBHelper.rMutex);
return 0;
}
@@ -1109,6 +1345,31 @@ void SubstitutePathVariables::SetPredefinedPathVariables( PredefinedPathVariable
aPreDefPathVariables.m_FixedVar[ PREDEFVAR_TEMP ] = ConvertOSLtoUCBURL( aTmp );
}
-} // namespace framework
+struct Instance {
+ explicit Instance(
+ css::uno::Reference<css::uno::XComponentContext> const & context):
+ instance(
+ static_cast<cppu::OWeakObject *>(new SubstitutePathVariables(context)))
+ {
+ }
+
+ css::uno::Reference<css::uno::XInterface> instance;
+};
+
+struct Singleton:
+ public rtl::StaticWithArg<
+ Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton>
+{};
+
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+com_sun_star_comp_framework_PathSubstitution_get_implementation(
+ css::uno::XComponentContext *context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(static_cast<cppu::OWeakObject *>(
+ Singleton::get(context).instance.get()));
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */