xref: /AOO41X/main/xmlhelp/source/treeview/tvfactory.cxx (revision 89dcb3da00a29b2b7b028d5bd430e2099844a09e)
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 
25 // MARKER(update_precomp.py): autogen include statement, do not remove
26 #include "precompiled_xmlhelp.hxx"
27 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
28 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
29 #include <com/sun/star/beans/PropertyValue.hpp>
30 #include "tvfactory.hxx"
31 #include "tvread.hxx"
32 
33 
34 using namespace treeview;
35 using namespace com::sun::star;
36 using namespace com::sun::star::uno;
37 using namespace com::sun::star::lang;
38 using namespace com::sun::star::beans;
39 using namespace com::sun::star::container;
40 
41 
42 
TVFactory(const uno::Reference<XMultiServiceFactory> & xMSF)43 TVFactory::TVFactory( const uno::Reference< XMultiServiceFactory >& xMSF )
44     : m_xMSF( xMSF )
45 {
46 }
47 
48 
~TVFactory()49 TVFactory::~TVFactory()
50 {
51 }
52 
53 
54 //////////////////////////////////////////////////////////////////////////
55 // XInterface
56 //////////////////////////////////////////////////////////////////////////
57 
58 void SAL_CALL
acquire(void)59 TVFactory::acquire(
60     void )
61     throw()
62 {
63   OWeakObject::acquire();
64 }
65 
66 
67 void SAL_CALL
release(void)68 TVFactory::release(
69               void )
70   throw()
71 {
72   OWeakObject::release();
73 }
74 
75 
76 Any SAL_CALL
queryInterface(const Type & rType)77 TVFactory::queryInterface(
78     const Type& rType )
79     throw( RuntimeException )
80 {
81     Any aRet = cppu::queryInterface( rType,
82                                      SAL_STATIC_CAST( XServiceInfo*,  this ),
83                                      SAL_STATIC_CAST( XTypeProvider*, this ),
84                                      SAL_STATIC_CAST( XMultiServiceFactory*, this ) );
85 
86     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
87 }
88 
89 
90 ////////////////////////////////////////////////////////////////////////////////
91 //
92 // XTypeProvider methods.
93 
94 XTYPEPROVIDER_IMPL_3( TVFactory,
95                       XServiceInfo,
96                       XTypeProvider,
97                       XMultiServiceFactory );
98 
99 
100 
101 ////////////////////////////////////////////////////////////////////////////////
102 
103 // XServiceInfo methods.
104 
105 rtl::OUString SAL_CALL
getImplementationName()106 TVFactory::getImplementationName()
107     throw( RuntimeException )
108 {
109     return TVFactory::getImplementationName_static();
110 }
111 
112 
113 sal_Bool SAL_CALL
supportsService(const rtl::OUString & ServiceName)114 TVFactory::supportsService(
115     const rtl::OUString& ServiceName )
116     throw( RuntimeException )
117 {
118     return
119         ServiceName.compareToAscii( "com.sun.star.help.TreeView" ) == 0 ||
120         ServiceName.compareToAscii( "com.sun.star.ucb.HiearchyDataSource" ) == 0;
121 }
122 
123 
124 Sequence< rtl::OUString > SAL_CALL
getSupportedServiceNames(void)125 TVFactory::getSupportedServiceNames( void )
126     throw( RuntimeException )
127 {
128     return TVFactory::getSupportedServiceNames_static();
129 }
130 
131 
132 
133 // XMultiServiceFactory
134 
135 Reference< XInterface > SAL_CALL
createInstance(const rtl::OUString & aServiceSpecifier)136 TVFactory::createInstance(
137     const rtl::OUString& aServiceSpecifier )
138     throw( Exception,
139            RuntimeException )
140 {
141     Any aAny;
142     aAny <<= rtl::OUString();
143     Sequence< Any > seq( 1 );
144     seq[0] <<= PropertyValue(
145         rtl::OUString::createFromAscii( "nodepath" ),
146         -1,
147         aAny,
148         PropertyState_DIRECT_VALUE );
149 
150     return createInstanceWithArguments( aServiceSpecifier,
151                                         seq );
152 }
153 
154 
155 Reference< XInterface > SAL_CALL
createInstanceWithArguments(const rtl::OUString & ServiceSpecifier,const Sequence<Any> & Arguments)156 TVFactory::createInstanceWithArguments(
157     const rtl::OUString& ServiceSpecifier,
158     const Sequence< Any >& Arguments )
159     throw( Exception,
160            RuntimeException )
161 {
162     (void)ServiceSpecifier;
163 
164     if( ! m_xHDS.is() )
165     {
166         cppu::OWeakObject* p = new TVChildTarget( m_xMSF );
167         m_xHDS = Reference< XInterface >( p );
168     }
169 
170     Reference< XInterface > ret = m_xHDS;
171 
172     rtl::OUString hierview;
173     for( int i = 0; i < Arguments.getLength(); ++i )
174     {
175         PropertyValue pV;
176         if( ! ( Arguments[i] >>= pV ) )
177             continue;
178 
179         if( pV.Name.compareToAscii( "nodepath" ) )
180             continue;
181 
182         if( ! ( pV.Value >>= hierview ) )
183             continue;
184 
185         break;
186     }
187 
188     if( hierview.getLength() )
189     {
190         Reference< XHierarchicalNameAccess > xhieraccess( m_xHDS,UNO_QUERY );
191         Any aAny = xhieraccess->getByHierarchicalName( hierview );
192         Reference< XInterface > xInterface;
193         aAny >>= xInterface;
194         return xInterface;
195     }
196     else
197         return m_xHDS;
198 }
199 
200 
201 Sequence< rtl::OUString > SAL_CALL
getAvailableServiceNames()202 TVFactory::getAvailableServiceNames( )
203     throw( RuntimeException )
204 {
205     Sequence< rtl::OUString > seq( 1 );
206     seq[0] = rtl::OUString::createFromAscii( "com.sun.star.ucb.HierarchyDataReadAccess" );
207     return seq;
208 }
209 
210 
211 
212 // static
213 
214 
215 rtl::OUString SAL_CALL
getImplementationName_static()216 TVFactory::getImplementationName_static()
217 {
218     return rtl::OUString::createFromAscii( "com.sun.star.help.TreeViewImpl" );
219 }
220 
221 
222 Sequence< rtl::OUString > SAL_CALL
getSupportedServiceNames_static()223 TVFactory::getSupportedServiceNames_static()
224 {
225     Sequence< rtl::OUString > seq( 2 );
226     seq[0] = rtl::OUString::createFromAscii( "com.sun.star.help.TreeView" );
227     seq[1] = rtl::OUString::createFromAscii( "com.sun.star.ucb.HiearchyDataSource" );
228     return seq;
229 }
230 
231 
232 Reference< XSingleServiceFactory > SAL_CALL
createServiceFactory(const Reference<XMultiServiceFactory> & rxServiceMgr)233 TVFactory::createServiceFactory(
234     const Reference< XMultiServiceFactory >& rxServiceMgr )
235 {
236     return Reference< XSingleServiceFactory > (
237         cppu::createSingleFactory(
238             rxServiceMgr,
239             TVFactory::getImplementationName_static(),
240             TVFactory::CreateInstance,
241             TVFactory::getSupportedServiceNames_static() ) );
242 }
243 
244 
245 
246 Reference< XInterface > SAL_CALL
CreateInstance(const Reference<XMultiServiceFactory> & xMultiServiceFactory)247 TVFactory::CreateInstance(
248     const Reference< XMultiServiceFactory >& xMultiServiceFactory )
249 {
250     XServiceInfo* xP = (XServiceInfo*) new TVFactory( xMultiServiceFactory );
251     return Reference< XInterface >::query( xP );
252 }
253 
254 //=========================================================================
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)255 extern "C" void SAL_CALL component_getImplementationEnvironment(
256     const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
257 {
258     (void)ppEnv;
259 
260     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
261 }
262 
263 //=========================================================================
component_getFactory(const sal_Char * pImplName,void * pServiceManager,void * pRegistryKey)264 extern "C" void * SAL_CALL component_getFactory(
265     const sal_Char * pImplName,void * pServiceManager,void * pRegistryKey )
266 {
267     (void)pRegistryKey;
268 
269     void * pRet = 0;
270 
271     Reference< XMultiServiceFactory > xSMgr(
272         reinterpret_cast< XMultiServiceFactory * >( pServiceManager ) );
273 
274     Reference< XSingleServiceFactory > xFactory;
275 
276     //////////////////////////////////////////////////////////////////////
277     // File Content Provider.
278     //////////////////////////////////////////////////////////////////////
279 
280     if ( TVFactory::getImplementationName_static().compareToAscii( pImplName ) == 0 )
281     {
282         xFactory = TVFactory::createServiceFactory( xSMgr );
283     }
284 
285     //////////////////////////////////////////////////////////////////////
286 
287     if ( xFactory.is() )
288     {
289         xFactory->acquire();
290         pRet = xFactory.get();
291     }
292 
293     return pRet;
294 }
295