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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_ucbhelper.hxx" 26 27 /************************************************************************** 28 TODO 29 ************************************************************************** 30 31 *************************************************************************/ 32 33 #ifndef _UCBHELPER_PROVCONF_HXX_ 34 #include <provconf.hxx> 35 #endif 36 #include <osl/diagnose.h> 37 #include <rtl/ustrbuf.hxx> 38 #include <com/sun/star/beans/PropertyValue.hpp> 39 #include <com/sun/star/container/XHierarchicalNameAccess.hpp> 40 #include <com/sun/star/container/XNameAccess.hpp> 41 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 42 43 using namespace com::sun::star; 44 45 //========================================================================= 46 47 #define CONFIG_CONTENTPROVIDERS_KEY \ 48 "/org.openoffice.ucb.Configuration/ContentProviders" 49 50 //========================================================================= 51 52 namespace ucbhelper { 53 54 void makeAndAppendXMLName( 55 rtl::OUStringBuffer & rBuffer, const rtl::OUString & rIn ) 56 { 57 sal_Int32 nCount = rIn.getLength(); 58 for ( sal_Int32 n = 0; n < nCount; ++n ) 59 { 60 const sal_Unicode c = rIn.getStr()[ n ]; 61 switch ( c ) 62 { 63 case '&': 64 rBuffer.appendAscii( "&" ); 65 break; 66 67 case '"': 68 rBuffer.appendAscii( """ ); 69 break; 70 71 case '\'': 72 rBuffer.appendAscii( "'" ); 73 break; 74 75 case '<': 76 rBuffer.appendAscii( "<" ); 77 break; 78 79 case '>': 80 rBuffer.appendAscii( ">" ); 81 break; 82 83 default: 84 rBuffer.append( c ); 85 break; 86 } 87 } 88 } 89 90 //========================================================================= 91 bool getContentProviderData( 92 const uno::Reference< lang::XMultiServiceFactory > & rServiceMgr, 93 const rtl::OUString & rKey1, 94 const rtl::OUString & rKey2, 95 ContentProviderDataList & rListToFill ) 96 { 97 if ( !rServiceMgr.is() || !rKey1.getLength() || !rKey2.getLength() ) 98 { 99 OSL_ENSURE( false, 100 "getContentProviderData - Invalid argument!" ); 101 return false; 102 } 103 104 try 105 { 106 uno::Reference< lang::XMultiServiceFactory > xConfigProv( 107 rServiceMgr->createInstance( 108 rtl::OUString::createFromAscii( 109 "com.sun.star.configuration.ConfigurationProvider" ) ), 110 uno::UNO_QUERY ); 111 112 if ( !xConfigProv.is() ) 113 { 114 OSL_ENSURE( false, 115 "getContentProviderData - No config provider!" ); 116 return false; 117 } 118 119 rtl::OUStringBuffer aFullPath; 120 aFullPath.appendAscii( CONFIG_CONTENTPROVIDERS_KEY "/['" ); 121 makeAndAppendXMLName( aFullPath, rKey1 ); 122 aFullPath.appendAscii( "']/SecondaryKeys/['" ); 123 makeAndAppendXMLName( aFullPath, rKey2 ); 124 aFullPath.appendAscii( "']/ProviderData" ); 125 126 uno::Sequence< uno::Any > aArguments( 1 ); 127 beans::PropertyValue aProperty; 128 aProperty.Name 129 = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); 130 aProperty.Value <<= aFullPath.makeStringAndClear(); 131 aArguments[ 0 ] <<= aProperty; 132 133 uno::Reference< uno::XInterface > xInterface( 134 xConfigProv->createInstanceWithArguments( 135 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 136 "com.sun.star.configuration.ConfigurationAccess" ) ), 137 aArguments ) ); 138 139 if ( !xInterface.is() ) 140 { 141 OSL_ENSURE( false, 142 "getContentProviderData - No config access!" ); 143 return false; 144 } 145 146 uno::Reference< container::XNameAccess > xNameAccess( 147 xInterface, uno::UNO_QUERY ); 148 149 if ( !xNameAccess.is() ) 150 { 151 OSL_ENSURE( false, 152 "getContentProviderData - No XNameAccess!" ); 153 return false; 154 } 155 156 uno::Sequence< rtl::OUString > aElems = xNameAccess->getElementNames(); 157 const rtl::OUString* pElems = aElems.getConstArray(); 158 sal_Int32 nCount = aElems.getLength(); 159 160 if ( nCount > 0 ) 161 { 162 uno::Reference< container::XHierarchicalNameAccess > 163 xHierNameAccess( xInterface, uno::UNO_QUERY ); 164 165 if ( !xHierNameAccess.is() ) 166 { 167 OSL_ENSURE( false, 168 "getContentProviderData - " 169 "No XHierarchicalNameAccess!" ); 170 return false; 171 } 172 173 // Iterate over children. 174 for ( sal_Int32 n = 0; n < nCount; ++n ) 175 { 176 rtl::OUStringBuffer aElemBuffer; 177 aElemBuffer.appendAscii( "['" ); 178 makeAndAppendXMLName( aElemBuffer, pElems[ n ] ); 179 180 try 181 { 182 ContentProviderData aInfo; 183 184 // Obtain service name. 185 rtl::OUStringBuffer aKeyBuffer = aElemBuffer; 186 aKeyBuffer.appendAscii( "']/ServiceName" ); 187 188 rtl::OUString aValue; 189 if ( !( xHierNameAccess->getByHierarchicalName( 190 aKeyBuffer.makeStringAndClear() ) >>= aValue ) ) 191 { 192 OSL_ENSURE( false, 193 "getContentProviderData - " 194 "Error getting item value!" ); 195 continue; 196 } 197 198 aInfo.ServiceName = aValue; 199 200 // Obtain URL Template. 201 aKeyBuffer = aElemBuffer; 202 aKeyBuffer.appendAscii( "']/URLTemplate" ); 203 204 if ( !( xHierNameAccess->getByHierarchicalName( 205 aKeyBuffer.makeStringAndClear() ) >>= aValue ) ) 206 { 207 OSL_ENSURE( false, 208 "getContentProviderData - " 209 "Error getting item value!" ); 210 continue; 211 } 212 213 aInfo.URLTemplate = aValue; 214 215 // Obtain Arguments. 216 aKeyBuffer = aElemBuffer; 217 aKeyBuffer.appendAscii( "']/Arguments" ); 218 219 if ( !( xHierNameAccess->getByHierarchicalName( 220 aKeyBuffer.makeStringAndClear() ) >>= aValue ) ) 221 { 222 OSL_ENSURE( false, 223 "getContentProviderData - " 224 "Error getting item value!" ); 225 continue; 226 } 227 228 aInfo.Arguments = aValue; 229 230 // Append info to list. 231 rListToFill.push_back( aInfo ); 232 } 233 catch ( container::NoSuchElementException& ) 234 { 235 // getByHierarchicalName 236 237 OSL_ENSURE( false, 238 "getContentProviderData - " 239 "caught NoSuchElementException!" ); 240 } 241 } 242 } 243 } 244 catch ( uno::RuntimeException& ) 245 { 246 OSL_ENSURE( false, 247 "getContentProviderData - caught RuntimeException!" ); 248 return false; 249 } 250 catch ( uno::Exception& ) 251 { 252 // createInstance, createInstanceWithArguments 253 254 OSL_ENSURE( false, 255 "getContentProviderData - caught Exception!" ); 256 return false; 257 } 258 259 return true; 260 } 261 262 } 263