Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : /**************************************************************************
22 : TODO
23 : **************************************************************************
24 :
25 : - XInitialization::initialize does not work any longer!
26 :
27 : *************************************************************************/
28 : #include <osl/diagnose.h>
29 : #include <com/sun/star/beans/PropertyValue.hpp>
30 : #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
31 : #include <com/sun/star/util/theOfficeInstallationDirectories.hpp>
32 : #include <comphelper/processfactory.hxx>
33 : #include <ucbhelper/contentidentifier.hxx>
34 : #include "hierarchyprovider.hxx"
35 : #include "hierarchycontent.hxx"
36 : #include "hierarchyuri.hxx"
37 :
38 : #include "../inc/urihelper.hxx"
39 :
40 : using namespace com::sun::star;
41 : using namespace hierarchy_ucp;
42 :
43 :
44 :
45 :
46 : // HierarchyContentProvider Implementation.
47 :
48 :
49 :
50 :
51 2 : HierarchyContentProvider::HierarchyContentProvider(
52 : const uno::Reference< uno::XComponentContext >& rxContext )
53 2 : : ::ucbhelper::ContentProviderImplHelper( rxContext )
54 : {
55 2 : }
56 :
57 :
58 : // virtual
59 4 : HierarchyContentProvider::~HierarchyContentProvider()
60 : {
61 4 : }
62 :
63 :
64 :
65 : // XInterface methods.
66 :
67 45 : void SAL_CALL HierarchyContentProvider::acquire()
68 : throw()
69 : {
70 45 : OWeakObject::acquire();
71 45 : }
72 :
73 45 : void SAL_CALL HierarchyContentProvider::release()
74 : throw()
75 : {
76 45 : OWeakObject::release();
77 45 : }
78 :
79 15 : css::uno::Any SAL_CALL HierarchyContentProvider::queryInterface( const css::uno::Type & rType )
80 : throw( css::uno::RuntimeException, std::exception )
81 : {
82 : css::uno::Any aRet = cppu::queryInterface( rType,
83 : (static_cast< lang::XTypeProvider* >(this)),
84 : (static_cast< lang::XServiceInfo* >(this)),
85 : (static_cast< ucb::XContentProvider* >(this)),
86 : (static_cast< lang::XInitialization* >(this))
87 15 : );
88 15 : return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
89 : }
90 :
91 : // XTypeProvider methods.
92 :
93 :
94 :
95 0 : XTYPEPROVIDER_IMPL_4( HierarchyContentProvider,
96 : lang::XTypeProvider,
97 : lang::XServiceInfo,
98 : ucb::XContentProvider,
99 : lang::XInitialization );
100 :
101 :
102 :
103 : // XServiceInfo methods.
104 :
105 :
106 :
107 16 : XSERVICEINFO_IMPL_1_CTX( HierarchyContentProvider,
108 : OUString( "com.sun.star.comp.ucb.HierarchyContentProvider" ),
109 : HIERARCHY_CONTENT_PROVIDER_SERVICE_NAME );
110 :
111 :
112 :
113 : // Service factory implementation.
114 :
115 :
116 :
117 2 : ONE_INSTANCE_SERVICE_FACTORY_IMPL( HierarchyContentProvider );
118 :
119 :
120 :
121 : // XContentProvider methods.
122 :
123 :
124 :
125 : // virtual
126 : uno::Reference< ucb::XContent > SAL_CALL
127 1 : HierarchyContentProvider::queryContent(
128 : const uno::Reference< ucb::XContentIdentifier >& Identifier )
129 : throw( ucb::IllegalIdentifierException, uno::RuntimeException, std::exception )
130 : {
131 1 : HierarchyUri aUri( Identifier->getContentIdentifier() );
132 1 : if ( !aUri.isValid() )
133 0 : throw ucb::IllegalIdentifierException();
134 :
135 : // Encode URL and create new Id. This may "correct" user-typed-in URL's.
136 : uno::Reference< ucb::XContentIdentifier > xCanonicId
137 2 : = new ::ucbhelper::ContentIdentifier( ::ucb_impl::urihelper::encodeURI( aUri.getUri() ) );
138 2 : osl::MutexGuard aGuard( m_aMutex );
139 :
140 : // Check, if a content with given id already exists...
141 : uno::Reference< ucb::XContent > xContent
142 1 : = queryExistingContent( xCanonicId ).get();
143 1 : if ( xContent.is() )
144 0 : return xContent;
145 :
146 : // Create a new content.
147 1 : xContent = HierarchyContent::create( m_xContext, this, xCanonicId );
148 1 : registerNewContent( xContent );
149 :
150 1 : if ( xContent.is() && !xContent->getIdentifier().is() )
151 0 : throw ucb::IllegalIdentifierException();
152 :
153 2 : return xContent;
154 : }
155 :
156 :
157 :
158 : // XInitialization methods.
159 :
160 :
161 :
162 : // virtual
163 0 : void SAL_CALL HierarchyContentProvider::initialize(
164 : const uno::Sequence< uno::Any >& aArguments )
165 : throw( uno::Exception, uno::RuntimeException, std::exception )
166 : {
167 0 : if ( aArguments.getLength() > 0 )
168 : OSL_FAIL( "HierarchyContentProvider::initialize : not supported!" );
169 0 : }
170 :
171 :
172 :
173 : // Non-interface methods.
174 :
175 :
176 :
177 : uno::Reference< lang::XMultiServiceFactory >
178 0 : HierarchyContentProvider::getConfigProvider(
179 : const OUString & rServiceSpecifier )
180 : {
181 0 : osl::MutexGuard aGuard( m_aMutex );
182 : ConfigProviderMap::iterator it = m_aConfigProviderMap.find(
183 0 : rServiceSpecifier );
184 0 : if ( it == m_aConfigProviderMap.end() )
185 : {
186 : try
187 : {
188 0 : ConfigProviderMapEntry aEntry;
189 : aEntry.xConfigProvider
190 0 : = uno::Reference< lang::XMultiServiceFactory >(
191 0 : m_xContext->getServiceManager()->createInstanceWithContext(rServiceSpecifier, m_xContext),
192 0 : uno::UNO_QUERY );
193 :
194 0 : if ( aEntry.xConfigProvider.is() )
195 : {
196 0 : m_aConfigProviderMap[ rServiceSpecifier ] = aEntry;
197 0 : return aEntry.xConfigProvider;
198 0 : }
199 : }
200 0 : catch ( uno::Exception const & )
201 : {
202 : // OSL_FAIL( // "HierarchyContentProvider::getConfigProvider - "
203 : // "caught exception!" );
204 : }
205 :
206 : OSL_FAIL( "HierarchyContentProvider::getConfigProvider - "
207 : "No config provider!" );
208 :
209 0 : return uno::Reference< lang::XMultiServiceFactory >();
210 : }
211 :
212 0 : return (*it).second.xConfigProvider;
213 : }
214 :
215 :
216 : uno::Reference< container::XHierarchicalNameAccess >
217 0 : HierarchyContentProvider::getRootConfigReadNameAccess(
218 : const OUString & rServiceSpecifier )
219 : {
220 0 : osl::MutexGuard aGuard( m_aMutex );
221 : ConfigProviderMap::iterator it = m_aConfigProviderMap.find(
222 0 : rServiceSpecifier );
223 0 : if ( it != m_aConfigProviderMap.end() )
224 : {
225 0 : if ( !( (*it).second.xRootReadAccess.is() ) )
226 : {
227 0 : if ( (*it).second.bTriedToGetRootReadAccess ) // #82494#
228 : {
229 : OSL_FAIL( "HierarchyContentProvider::getRootConfigReadNameAccess - "
230 : "Unable to read any config data! -> #82494#" );
231 0 : return uno::Reference< container::XHierarchicalNameAccess >();
232 : }
233 :
234 : try
235 : {
236 : uno::Reference< lang::XMultiServiceFactory > xConfigProv
237 0 : = getConfigProvider( rServiceSpecifier );
238 :
239 0 : if ( xConfigProv.is() )
240 : {
241 0 : uno::Sequence< uno::Any > aArguments( 1 );
242 0 : beans::PropertyValue aProperty;
243 0 : aProperty.Name = "nodepath" ;
244 0 : aProperty.Value <<= OUString(); // root path
245 0 : aArguments[ 0 ] <<= aProperty;
246 :
247 0 : (*it).second.bTriedToGetRootReadAccess = true;
248 :
249 0 : (*it).second.xRootReadAccess
250 0 : = uno::Reference< container::XHierarchicalNameAccess >(
251 0 : xConfigProv->createInstanceWithArguments(
252 : OUString( "com.sun.star.ucb.HierarchyDataReadAccess" ),
253 0 : aArguments ),
254 0 : uno::UNO_QUERY );
255 0 : }
256 : }
257 0 : catch ( uno::RuntimeException const & )
258 : {
259 0 : throw;
260 : }
261 0 : catch ( uno::Exception const & )
262 : {
263 : // createInstance, createInstanceWithArguments
264 :
265 : OSL_FAIL( "HierarchyContentProvider::getRootConfigReadNameAccess - "
266 : "caught Exception!" );
267 : }
268 : }
269 : }
270 :
271 0 : return (*it).second.xRootReadAccess;
272 : }
273 :
274 :
275 : uno::Reference< util::XOfficeInstallationDirectories >
276 0 : HierarchyContentProvider::getOfficeInstallationDirectories()
277 : {
278 0 : if ( !m_xOfficeInstDirs.is() )
279 : {
280 0 : osl::MutexGuard aGuard( m_aMutex );
281 0 : if ( !m_xOfficeInstDirs.is() )
282 : {
283 : OSL_ENSURE( m_xContext.is(), "No service manager!" );
284 :
285 0 : m_xOfficeInstDirs = util::theOfficeInstallationDirectories::get(m_xContext);
286 0 : }
287 : }
288 0 : return m_xOfficeInstDirs;
289 : }
290 :
291 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|