1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef __FRAMEWORK_SERVICES_SUBSTPATHVARS_HXX_ 25 #define __FRAMEWORK_SERVICES_SUBSTPATHVARS_HXX_ 26 27 /** Attention: stl headers must(!) be included at first. Otherwhise it can make trouble 28 with solaris headers ... 29 */ 30 #include <vector> 31 #include <list> 32 #include <hash_map> 33 34 //_________________________________________________________________________________________________________________ 35 // my own includes 36 //_________________________________________________________________________________________________________________ 37 #include <threadhelp/threadhelpbase.hxx> 38 #include <macros/generic.hxx> 39 #include <macros/xinterface.hxx> 40 #include <macros/xtypeprovider.hxx> 41 #include <macros/xserviceinfo.hxx> 42 #include <stdtypes.h> 43 44 //_________________________________________________________________________________________________________________ 45 // interface includes 46 //_________________________________________________________________________________________________________________ 47 #include <com/sun/star/lang/XServiceInfo.hpp> 48 #include <com/sun/star/lang/XTypeProvider.hpp> 49 #include <com/sun/star/container/NoSuchElementException.hpp> 50 #include <com/sun/star/util/XStringSubstitution.hpp> 51 52 //_________________________________________________________________________________________________________________ 53 // other includes 54 //_________________________________________________________________________________________________________________ 55 #include <cppuhelper/implbase2.hxx> 56 #include <rtl/ustring.hxx> 57 #include <unotools/configitem.hxx> 58 #include <tools/link.hxx> 59 #include <i18npool/lang.h> 60 61 namespace framework 62 { 63 64 // Must be zero value based 65 enum EnvironmentType 66 { 67 ET_HOST = 0 , 68 ET_YPDOMAIN , 69 ET_DNSDOMAIN , 70 ET_NTDOMAIN , 71 ET_OS , 72 ET_UNKNOWN , 73 ET_COUNT 74 }; 75 76 // Must be zero value based 77 enum OperatingSystem 78 { 79 OS_WINDOWS = 0, 80 OS_UNIX , 81 OS_SOLARIS , 82 OS_LINUX , 83 OS_UNKNOWN , 84 OS_COUNT 85 }; 86 87 struct SubstituteRule 88 { 89 SubstituteRule() {} 90 SubstituteRule( const rtl::OUString& aVarName, 91 const rtl::OUString& aValue, 92 const com::sun::star::uno::Any& aVal, 93 EnvironmentType aType ) : 94 aSubstVariable( aVarName ), aSubstValue( aValue ), aEnvValue( aVal ), aEnvType( aType ) {} 95 96 rtl::OUString aSubstVariable; 97 rtl::OUString aSubstValue; 98 com::sun::star::uno::Any aEnvValue; 99 EnvironmentType aEnvType; 100 }; 101 102 struct SubstitutePathNotify 103 { 104 SubstitutePathNotify() {}; 105 106 const com::sun::star::uno::Sequence<rtl::OUString> aPropertyNames; 107 }; 108 109 class SubstituteVariables : public ::std::hash_map< ::rtl::OUString, 110 SubstituteRule, 111 rtl::OUStringHash, 112 ::std::equal_to< ::rtl::OUString > > 113 { 114 public: 115 inline void free() 116 { 117 SubstituteVariables().swap( *this ); 118 } 119 }; 120 121 typedef std::vector< SubstituteRule > SubstituteRuleVector; 122 class SubstitutePathVariables_Impl : public utl::ConfigItem 123 { 124 public: 125 SubstitutePathVariables_Impl( const Link& aNotifyLink ); 126 virtual ~SubstitutePathVariables_Impl(); 127 128 static OperatingSystem GetOperatingSystemFromString( const rtl::OUString& ); 129 static EnvironmentType GetEnvTypeFromString( const rtl::OUString& ); 130 131 void GetSharePointsRules( SubstituteVariables& aSubstVarMap ); 132 133 /** is called from the ConfigManager before application ends or from the 134 PropertyChangeListener if the sub tree broadcasts changes. */ 135 virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); 136 virtual void Commit(); 137 138 private: 139 // Wrapper methods for low-level functions 140 OperatingSystem GetOperatingSystem(); 141 const rtl::OUString& GetYPDomainName(); 142 const rtl::OUString& GetDNSDomainName(); 143 const rtl::OUString& GetNTDomainName(); 144 const rtl::OUString& GetHostName(); 145 146 bool FilterRuleSet( const SubstituteRuleVector& aRuleSet, SubstituteRule& aActiveRule ); 147 148 void ReadSharePointsFromConfiguration( com::sun::star::uno::Sequence< rtl::OUString >& aSharePointsSeq ); 149 void ReadSharePointRuleSetFromConfiguration( const rtl::OUString& aSharePointName, 150 const rtl::OUString& aSharePointNodeName, 151 SubstituteRuleVector& aRuleSet ); 152 153 // Stored values for domains and host 154 bool m_bYPDomainRetrieved; 155 rtl::OUString m_aYPDomain; 156 bool m_bDNSDomainRetrieved; 157 rtl::OUString m_aDNSDomain; 158 bool m_bNTDomainRetrieved; 159 rtl::OUString m_aNTDomain; 160 bool m_bHostRetrieved; 161 rtl::OUString m_aHost; 162 bool m_bOSRetrieved; 163 OperatingSystem m_eOSType; 164 165 Link m_aListenerNotify; 166 const rtl::OUString m_aSharePointsNodeName; 167 const rtl::OUString m_aDirPropertyName; 168 const rtl::OUString m_aEnvPropertyName; 169 const rtl::OUString m_aLevelSep; 170 }; 171 172 enum PreDefVariable 173 { 174 PREDEFVAR_INST, 175 PREDEFVAR_PROG, 176 PREDEFVAR_USER, 177 PREDEFVAR_WORK, 178 PREDEFVAR_HOME, 179 PREDEFVAR_TEMP, 180 PREDEFVAR_PATH, 181 PREDEFVAR_LANG, 182 PREDEFVAR_LANGID, 183 PREDEFVAR_VLANG, 184 PREDEFVAR_INSTPATH, 185 PREDEFVAR_PROGPATH, 186 PREDEFVAR_USERPATH, 187 PREDEFVAR_INSTURL, 188 PREDEFVAR_PROGURL, 189 PREDEFVAR_USERURL, 190 PREDEFVAR_WORKDIRURL, 191 // --> PB 2004-10-27 #i32656# - new variable of hierarchy service 192 PREDEFVAR_BASEINSTURL, 193 PREDEFVAR_USERDATAURL, 194 // <-- 195 PREDEFVAR_BRANDBASEURL, 196 PREDEFVAR_COUNT 197 }; 198 199 struct PredefinedPathVariables 200 { 201 // Predefined variables supported by substitute variables 202 LanguageType m_eLanguageType; // Lanuage type of Office 203 rtl::OUString m_FixedVar[ PREDEFVAR_COUNT ]; // Variable value access by PreDefVariable 204 rtl::OUString m_FixedVarNames[ PREDEFVAR_COUNT ]; // Variable name access by PreDefVariable 205 }; 206 207 struct ReSubstFixedVarOrder 208 { 209 sal_Int32 nVarValueLength; 210 PreDefVariable eVariable; 211 212 bool operator< ( const ReSubstFixedVarOrder& aFixedVarOrder ) const 213 { 214 // Reverse operator< to have high to low ordering 215 return ( nVarValueLength > aFixedVarOrder.nVarValueLength ); 216 } 217 }; 218 219 struct ReSubstUserVarOrder 220 { 221 sal_Int32 nVarValueLength; 222 rtl::OUString aVarName; 223 224 bool operator< ( const ReSubstUserVarOrder& aUserVarOrder ) const 225 { 226 // Reverse operator< to have high to low ordering 227 return ( nVarValueLength > aUserVarOrder.nVarValueLength ); 228 } 229 }; 230 231 typedef std::list< ReSubstFixedVarOrder > ReSubstFixedVarOrderVector; 232 typedef std::list< ReSubstUserVarOrder > ReSubstUserVarOrderVector; 233 234 class SubstitutePathVariables : private ThreadHelpBase, // Struct for right initialization of mutex member! Must be first of baseclasses. 235 public ::cppu::WeakImplHelper2< ::com::sun::star::util::XStringSubstitution, css::lang::XServiceInfo > 236 { 237 friend class SubstitutePathVariables_Impl; 238 239 public: 240 SubstitutePathVariables( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ); 241 virtual ~SubstitutePathVariables(); 242 243 // XInterface, XTypeProvider, XServiceInfo 244 DECLARE_XSERVICEINFO 245 246 // XStringSubstitution 247 virtual rtl::OUString SAL_CALL substituteVariables( const ::rtl::OUString& aText, sal_Bool bSubstRequired ) 248 throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 249 virtual rtl::OUString SAL_CALL reSubstituteVariables( const ::rtl::OUString& aText ) 250 throw (::com::sun::star::uno::RuntimeException); 251 virtual ::rtl::OUString SAL_CALL getSubstituteVariableValue( const ::rtl::OUString& variable ) 252 throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 253 254 protected: 255 DECL_LINK( implts_ConfigurationNotify, SubstitutePathNotify* ); 256 257 void SetPredefinedPathVariables( PredefinedPathVariables& ); 258 rtl::OUString ConvertOSLtoUCBURL( const rtl::OUString& aOSLCompliantURL ) const; 259 260 // Special case (transient) values can change during runtime! 261 // Don't store them in the pre defined struct 262 rtl::OUString GetWorkPath() const; 263 rtl::OUString GetWorkVariableValue() const; 264 rtl::OUString GetPathVariableValue() const; 265 266 rtl::OUString GetHomeVariableValue() const; 267 268 // XStringSubstitution implementation methods 269 rtl::OUString impl_substituteVariable( const ::rtl::OUString& aText, bool bSustRequired ) 270 throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 271 rtl::OUString impl_reSubstituteVariables( const ::rtl::OUString& aText ) 272 throw (::com::sun::star::uno::RuntimeException); 273 ::rtl::OUString impl_getSubstituteVariableValue( const ::rtl::OUString& variable ) 274 throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 275 276 private: 277 class VarNameToIndexMap : public std::hash_map< ::rtl::OUString, 278 PreDefVariable, 279 rtl::OUStringHash, 280 ::std::equal_to< ::rtl::OUString > > 281 { 282 inline void free() 283 { 284 VarNameToIndexMap().swap( *this ); 285 } 286 }; 287 288 // heavy used string 289 const rtl::OUString m_aVarStart; 290 const rtl::OUString m_aVarEnd; 291 292 VarNameToIndexMap m_aPreDefVarMap; // Mapping from pre-def variable names to enum for array access 293 SubstituteVariables m_aSubstVarMap; // Active rule set map indexed by variable name! 294 PredefinedPathVariables m_aPreDefVars; // All predefined variables 295 SubstitutePathVariables_Impl m_aImpl; // Implementation class that access the configuration 296 ReSubstFixedVarOrderVector m_aReSubstFixedVarOrder; // To speed up resubstitution fixed variables (order for lookup) 297 ReSubstUserVarOrderVector m_aReSubstUserVarOrder; // To speed up resubstitution user variables 298 com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > m_xServiceManager; 299 }; 300 301 } 302 303 #endif // __FRAMEWORK_SERVICES_SUBSTPATHVARS_HXX_ 304