1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 29 // MARKER(update_precomp.py): autogen include statement, do not remove 30 #include "precompiled_xmlhelp.hxx" 31 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 32 #include <com/sun/star/container/XHierarchicalNameAccess.hpp> 33 #include <com/sun/star/beans/PropertyValue.hpp> 34 #include "tvfactory.hxx" 35 #include "tvread.hxx" 36 37 38 using namespace treeview; 39 using namespace com::sun::star; 40 using namespace com::sun::star::uno; 41 using namespace com::sun::star::lang; 42 using namespace com::sun::star::beans; 43 using namespace com::sun::star::container; 44 45 46 47 TVFactory::TVFactory( const uno::Reference< XMultiServiceFactory >& xMSF ) 48 : m_xMSF( xMSF ) 49 { 50 } 51 52 53 TVFactory::~TVFactory() 54 { 55 } 56 57 58 ////////////////////////////////////////////////////////////////////////// 59 // XInterface 60 ////////////////////////////////////////////////////////////////////////// 61 62 void SAL_CALL 63 TVFactory::acquire( 64 void ) 65 throw() 66 { 67 OWeakObject::acquire(); 68 } 69 70 71 void SAL_CALL 72 TVFactory::release( 73 void ) 74 throw() 75 { 76 OWeakObject::release(); 77 } 78 79 80 Any SAL_CALL 81 TVFactory::queryInterface( 82 const Type& rType ) 83 throw( RuntimeException ) 84 { 85 Any aRet = cppu::queryInterface( rType, 86 SAL_STATIC_CAST( XServiceInfo*, this ), 87 SAL_STATIC_CAST( XTypeProvider*, this ), 88 SAL_STATIC_CAST( XMultiServiceFactory*, this ) ); 89 90 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 91 } 92 93 94 //////////////////////////////////////////////////////////////////////////////// 95 // 96 // XTypeProvider methods. 97 98 XTYPEPROVIDER_IMPL_3( TVFactory, 99 XServiceInfo, 100 XTypeProvider, 101 XMultiServiceFactory ); 102 103 104 105 //////////////////////////////////////////////////////////////////////////////// 106 107 // XServiceInfo methods. 108 109 rtl::OUString SAL_CALL 110 TVFactory::getImplementationName() 111 throw( RuntimeException ) 112 { 113 return TVFactory::getImplementationName_static(); 114 } 115 116 117 sal_Bool SAL_CALL 118 TVFactory::supportsService( 119 const rtl::OUString& ServiceName ) 120 throw( RuntimeException ) 121 { 122 return 123 ServiceName.compareToAscii( "com.sun.star.help.TreeView" ) == 0 || 124 ServiceName.compareToAscii( "com.sun.star.ucb.HiearchyDataSource" ) == 0; 125 } 126 127 128 Sequence< rtl::OUString > SAL_CALL 129 TVFactory::getSupportedServiceNames( void ) 130 throw( RuntimeException ) 131 { 132 return TVFactory::getSupportedServiceNames_static(); 133 } 134 135 136 137 // XMultiServiceFactory 138 139 Reference< XInterface > SAL_CALL 140 TVFactory::createInstance( 141 const rtl::OUString& aServiceSpecifier ) 142 throw( Exception, 143 RuntimeException ) 144 { 145 Any aAny; 146 aAny <<= rtl::OUString(); 147 Sequence< Any > seq( 1 ); 148 seq[0] <<= PropertyValue( 149 rtl::OUString::createFromAscii( "nodepath" ), 150 -1, 151 aAny, 152 PropertyState_DIRECT_VALUE ); 153 154 return createInstanceWithArguments( aServiceSpecifier, 155 seq ); 156 } 157 158 159 Reference< XInterface > SAL_CALL 160 TVFactory::createInstanceWithArguments( 161 const rtl::OUString& ServiceSpecifier, 162 const Sequence< Any >& Arguments ) 163 throw( Exception, 164 RuntimeException ) 165 { 166 (void)ServiceSpecifier; 167 168 if( ! m_xHDS.is() ) 169 { 170 cppu::OWeakObject* p = new TVChildTarget( m_xMSF ); 171 m_xHDS = Reference< XInterface >( p ); 172 } 173 174 Reference< XInterface > ret = m_xHDS; 175 176 rtl::OUString hierview; 177 for( int i = 0; i < Arguments.getLength(); ++i ) 178 { 179 PropertyValue pV; 180 if( ! ( Arguments[i] >>= pV ) ) 181 continue; 182 183 if( pV.Name.compareToAscii( "nodepath" ) ) 184 continue; 185 186 if( ! ( pV.Value >>= hierview ) ) 187 continue; 188 189 break; 190 } 191 192 if( hierview.getLength() ) 193 { 194 Reference< XHierarchicalNameAccess > xhieraccess( m_xHDS,UNO_QUERY ); 195 Any aAny = xhieraccess->getByHierarchicalName( hierview ); 196 Reference< XInterface > xInterface; 197 aAny >>= xInterface; 198 return xInterface; 199 } 200 else 201 return m_xHDS; 202 } 203 204 205 Sequence< rtl::OUString > SAL_CALL 206 TVFactory::getAvailableServiceNames( ) 207 throw( RuntimeException ) 208 { 209 Sequence< rtl::OUString > seq( 1 ); 210 seq[0] = rtl::OUString::createFromAscii( "com.sun.star.ucb.HierarchyDataReadAccess" ); 211 return seq; 212 } 213 214 215 216 // static 217 218 219 rtl::OUString SAL_CALL 220 TVFactory::getImplementationName_static() 221 { 222 return rtl::OUString::createFromAscii( "com.sun.star.help.TreeViewImpl" ); 223 } 224 225 226 Sequence< rtl::OUString > SAL_CALL 227 TVFactory::getSupportedServiceNames_static() 228 { 229 Sequence< rtl::OUString > seq( 2 ); 230 seq[0] = rtl::OUString::createFromAscii( "com.sun.star.help.TreeView" ); 231 seq[1] = rtl::OUString::createFromAscii( "com.sun.star.ucb.HiearchyDataSource" ); 232 return seq; 233 } 234 235 236 Reference< XSingleServiceFactory > SAL_CALL 237 TVFactory::createServiceFactory( 238 const Reference< XMultiServiceFactory >& rxServiceMgr ) 239 { 240 return Reference< XSingleServiceFactory > ( 241 cppu::createSingleFactory( 242 rxServiceMgr, 243 TVFactory::getImplementationName_static(), 244 TVFactory::CreateInstance, 245 TVFactory::getSupportedServiceNames_static() ) ); 246 } 247 248 249 250 Reference< XInterface > SAL_CALL 251 TVFactory::CreateInstance( 252 const Reference< XMultiServiceFactory >& xMultiServiceFactory ) 253 { 254 XServiceInfo* xP = (XServiceInfo*) new TVFactory( xMultiServiceFactory ); 255 return Reference< XInterface >::query( xP ); 256 } 257 258 //========================================================================= 259 extern "C" void SAL_CALL component_getImplementationEnvironment( 260 const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) 261 { 262 (void)ppEnv; 263 264 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 265 } 266 267 //========================================================================= 268 extern "C" void * SAL_CALL component_getFactory( 269 const sal_Char * pImplName,void * pServiceManager,void * pRegistryKey ) 270 { 271 (void)pRegistryKey; 272 273 void * pRet = 0; 274 275 Reference< XMultiServiceFactory > xSMgr( 276 reinterpret_cast< XMultiServiceFactory * >( pServiceManager ) ); 277 278 Reference< XSingleServiceFactory > xFactory; 279 280 ////////////////////////////////////////////////////////////////////// 281 // File Content Provider. 282 ////////////////////////////////////////////////////////////////////// 283 284 if ( TVFactory::getImplementationName_static().compareToAscii( pImplName ) == 0 ) 285 { 286 xFactory = TVFactory::createServiceFactory( xSMgr ); 287 } 288 289 ////////////////////////////////////////////////////////////////////// 290 291 if ( xFactory.is() ) 292 { 293 xFactory->acquire(); 294 pRet = xFactory.get(); 295 } 296 297 return pRet; 298 } 299