1dde7d3faSAndrew Rist /**************************************************************
2dde7d3faSAndrew Rist *
3dde7d3faSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4dde7d3faSAndrew Rist * or more contributor license agreements. See the NOTICE file
5dde7d3faSAndrew Rist * distributed with this work for additional information
6dde7d3faSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7dde7d3faSAndrew Rist * to you under the Apache License, Version 2.0 (the
8dde7d3faSAndrew Rist * "License"); you may not use this file except in compliance
9dde7d3faSAndrew Rist * with the License. You may obtain a copy of the License at
10dde7d3faSAndrew Rist *
11dde7d3faSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12dde7d3faSAndrew Rist *
13dde7d3faSAndrew Rist * Unless required by applicable law or agreed to in writing,
14dde7d3faSAndrew Rist * software distributed under the License is distributed on an
15dde7d3faSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16dde7d3faSAndrew Rist * KIND, either express or implied. See the License for the
17dde7d3faSAndrew Rist * specific language governing permissions and limitations
18dde7d3faSAndrew Rist * under the License.
19dde7d3faSAndrew Rist *
20dde7d3faSAndrew Rist *************************************************************/
21dde7d3faSAndrew Rist
22dde7d3faSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_comphelper.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "comphelper_module.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir /**************************************************************************
30cdf0e10cSrcweir TODO
31cdf0e10cSrcweir **************************************************************************
32cdf0e10cSrcweir
33cdf0e10cSrcweir *************************************************************************/
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include "osl/file.hxx"
36cdf0e10cSrcweir #include "com/sun/star/beans/XPropertySet.hpp"
37cdf0e10cSrcweir #include "com/sun/star/util/XMacroExpander.hpp"
38cdf0e10cSrcweir
39cdf0e10cSrcweir #include "officeinstallationdirectories.hxx"
40cdf0e10cSrcweir
41cdf0e10cSrcweir using namespace com::sun::star;
42cdf0e10cSrcweir
43cdf0e10cSrcweir using namespace comphelper;
44cdf0e10cSrcweir
45cdf0e10cSrcweir //=========================================================================
46cdf0e10cSrcweir // helpers
47cdf0e10cSrcweir //=========================================================================
48cdf0e10cSrcweir
49cdf0e10cSrcweir //=========================================================================
makeCanonicalFileURL(rtl::OUString & rURL)50cdf0e10cSrcweir static bool makeCanonicalFileURL( rtl::OUString & rURL )
51cdf0e10cSrcweir {
52cdf0e10cSrcweir OSL_ENSURE( rURL.matchAsciiL( "file:", sizeof( "file:" ) - 1 , 0 ) ,
53cdf0e10cSrcweir "File URL expected!" );
54cdf0e10cSrcweir
55cdf0e10cSrcweir rtl::OUString aNormalizedURL;
56cdf0e10cSrcweir if ( osl::FileBase::getAbsoluteFileURL( rtl::OUString(),
57cdf0e10cSrcweir rURL,
58cdf0e10cSrcweir aNormalizedURL )
59cdf0e10cSrcweir == osl::DirectoryItem::E_None )
60cdf0e10cSrcweir {
61cdf0e10cSrcweir osl::DirectoryItem aDirItem;
62cdf0e10cSrcweir if ( osl::DirectoryItem::get( aNormalizedURL, aDirItem )
63cdf0e10cSrcweir == osl::DirectoryItem::E_None )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir osl::FileStatus aFileStatus( FileStatusMask_FileURL );
66cdf0e10cSrcweir
67cdf0e10cSrcweir if ( aDirItem.getFileStatus( aFileStatus )
68cdf0e10cSrcweir == osl::DirectoryItem::E_None )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir aNormalizedURL = aFileStatus.getFileURL();
71cdf0e10cSrcweir
72*49b34792SHerbert Dürr if ( !aNormalizedURL.isEmpty() )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir if ( aNormalizedURL
75cdf0e10cSrcweir .getStr()[ aNormalizedURL.getLength() - 1 ]
76cdf0e10cSrcweir != sal_Unicode( '/' ) )
77cdf0e10cSrcweir rURL = aNormalizedURL;
78cdf0e10cSrcweir else
79cdf0e10cSrcweir rURL = aNormalizedURL
80cdf0e10cSrcweir .copy( 0, aNormalizedURL.getLength() - 1 );
81cdf0e10cSrcweir
82cdf0e10cSrcweir return true;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir }
85cdf0e10cSrcweir }
86cdf0e10cSrcweir }
87cdf0e10cSrcweir return false;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir
90cdf0e10cSrcweir //=========================================================================
91cdf0e10cSrcweir //=========================================================================
92cdf0e10cSrcweir //
93cdf0e10cSrcweir // OfficeInstallationDirectories Implementation.
94cdf0e10cSrcweir //
95cdf0e10cSrcweir //=========================================================================
96cdf0e10cSrcweir //=========================================================================
97cdf0e10cSrcweir
OfficeInstallationDirectories(const uno::Reference<uno::XComponentContext> & xCtx)98cdf0e10cSrcweir OfficeInstallationDirectories::OfficeInstallationDirectories(
99cdf0e10cSrcweir const uno::Reference< uno::XComponentContext > & xCtx )
100cdf0e10cSrcweir : m_aOfficeBrandDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(brandbaseurl)" ) ),
101cdf0e10cSrcweir m_aOfficeBaseDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(baseinsturl)" ) ),
102cdf0e10cSrcweir m_aUserDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(userdataurl)" ) ),
103cdf0e10cSrcweir m_xCtx( xCtx ),
104cdf0e10cSrcweir m_pOfficeBrandDir( 0 ),
105cdf0e10cSrcweir m_pOfficeBaseDir( 0 ),
106cdf0e10cSrcweir m_pUserDir( 0 )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir }
109cdf0e10cSrcweir
110cdf0e10cSrcweir //=========================================================================
111cdf0e10cSrcweir // virtual
~OfficeInstallationDirectories()112cdf0e10cSrcweir OfficeInstallationDirectories::~OfficeInstallationDirectories()
113cdf0e10cSrcweir {
114cdf0e10cSrcweir delete m_pOfficeBrandDir;
115cdf0e10cSrcweir delete m_pOfficeBaseDir;
116cdf0e10cSrcweir delete m_pUserDir;
117cdf0e10cSrcweir }
118cdf0e10cSrcweir
119cdf0e10cSrcweir //=========================================================================
120cdf0e10cSrcweir // util::XOfficeInstallationDirectories
121cdf0e10cSrcweir //=========================================================================
122cdf0e10cSrcweir
123cdf0e10cSrcweir // virtual
124cdf0e10cSrcweir rtl::OUString SAL_CALL
getOfficeInstallationDirectoryURL()125cdf0e10cSrcweir OfficeInstallationDirectories::getOfficeInstallationDirectoryURL()
126cdf0e10cSrcweir throw ( uno::RuntimeException )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir initDirs();
129cdf0e10cSrcweir return rtl::OUString( *m_pOfficeBrandDir );
130cdf0e10cSrcweir }
131cdf0e10cSrcweir
132cdf0e10cSrcweir //=========================================================================
133cdf0e10cSrcweir // virtual
134cdf0e10cSrcweir rtl::OUString SAL_CALL
getOfficeUserDataDirectoryURL()135cdf0e10cSrcweir OfficeInstallationDirectories::getOfficeUserDataDirectoryURL()
136cdf0e10cSrcweir throw ( uno::RuntimeException )
137cdf0e10cSrcweir {
138cdf0e10cSrcweir initDirs();
139cdf0e10cSrcweir return rtl::OUString( *m_pUserDir );
140cdf0e10cSrcweir }
141cdf0e10cSrcweir
142cdf0e10cSrcweir
143cdf0e10cSrcweir //=========================================================================
144cdf0e10cSrcweir // virtual
145cdf0e10cSrcweir rtl::OUString SAL_CALL
makeRelocatableURL(const rtl::OUString & URL)146cdf0e10cSrcweir OfficeInstallationDirectories::makeRelocatableURL( const rtl::OUString& URL )
147cdf0e10cSrcweir throw ( uno::RuntimeException )
148cdf0e10cSrcweir {
149*49b34792SHerbert Dürr if ( !URL.isEmpty() )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir initDirs();
152cdf0e10cSrcweir
153cdf0e10cSrcweir rtl::OUString aCanonicalURL( URL );
154cdf0e10cSrcweir makeCanonicalFileURL( aCanonicalURL );
155cdf0e10cSrcweir
156cdf0e10cSrcweir sal_Int32 nIndex = aCanonicalURL.indexOf( *m_pOfficeBrandDir );
157cdf0e10cSrcweir if ( nIndex != -1 )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir return rtl::OUString(
160cdf0e10cSrcweir URL.replaceAt( nIndex,
161cdf0e10cSrcweir m_pOfficeBrandDir->getLength(),
162cdf0e10cSrcweir m_aOfficeBrandDirMacro ) );
163cdf0e10cSrcweir }
164cdf0e10cSrcweir else
165cdf0e10cSrcweir {
166cdf0e10cSrcweir nIndex = aCanonicalURL.indexOf( *m_pOfficeBaseDir );
167cdf0e10cSrcweir if ( nIndex != -1 )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir return rtl::OUString(
170cdf0e10cSrcweir URL.replaceAt( nIndex,
171cdf0e10cSrcweir m_pOfficeBaseDir->getLength(),
172cdf0e10cSrcweir m_aOfficeBaseDirMacro ) );
173cdf0e10cSrcweir }
174cdf0e10cSrcweir else
175cdf0e10cSrcweir {
176cdf0e10cSrcweir nIndex = aCanonicalURL.indexOf( *m_pUserDir );
177cdf0e10cSrcweir if ( nIndex != -1 )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir return rtl::OUString(
180cdf0e10cSrcweir URL.replaceAt( nIndex,
181cdf0e10cSrcweir m_pUserDir->getLength(),
182cdf0e10cSrcweir m_aUserDirMacro ) );
183cdf0e10cSrcweir }
184cdf0e10cSrcweir }
185cdf0e10cSrcweir }
186cdf0e10cSrcweir }
187cdf0e10cSrcweir return rtl::OUString( URL );
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
190cdf0e10cSrcweir //=========================================================================
191cdf0e10cSrcweir // virtual
192cdf0e10cSrcweir rtl::OUString SAL_CALL
makeAbsoluteURL(const rtl::OUString & URL)193cdf0e10cSrcweir OfficeInstallationDirectories::makeAbsoluteURL( const rtl::OUString& URL )
194cdf0e10cSrcweir throw ( uno::RuntimeException )
195cdf0e10cSrcweir {
196*49b34792SHerbert Dürr if ( !URL.isEmpty() )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir sal_Int32 nIndex = URL.indexOf( m_aOfficeBrandDirMacro );
199cdf0e10cSrcweir if ( nIndex != -1 )
200cdf0e10cSrcweir {
201cdf0e10cSrcweir initDirs();
202cdf0e10cSrcweir
203cdf0e10cSrcweir return rtl::OUString(
204cdf0e10cSrcweir URL.replaceAt( nIndex,
205cdf0e10cSrcweir m_aOfficeBrandDirMacro.getLength(),
206cdf0e10cSrcweir *m_pOfficeBrandDir ) );
207cdf0e10cSrcweir }
208cdf0e10cSrcweir else
209cdf0e10cSrcweir {
210cdf0e10cSrcweir nIndex = URL.indexOf( m_aOfficeBaseDirMacro );
211cdf0e10cSrcweir if ( nIndex != -1 )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir initDirs();
214cdf0e10cSrcweir
215cdf0e10cSrcweir return rtl::OUString(
216cdf0e10cSrcweir URL.replaceAt( nIndex,
217cdf0e10cSrcweir m_aOfficeBaseDirMacro.getLength(),
218cdf0e10cSrcweir *m_pOfficeBaseDir ) );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir else
221cdf0e10cSrcweir {
222cdf0e10cSrcweir nIndex = URL.indexOf( m_aUserDirMacro );
223cdf0e10cSrcweir if ( nIndex != -1 )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir initDirs();
226cdf0e10cSrcweir
227cdf0e10cSrcweir return rtl::OUString(
228cdf0e10cSrcweir URL.replaceAt( nIndex,
229cdf0e10cSrcweir m_aUserDirMacro.getLength(),
230cdf0e10cSrcweir *m_pUserDir ) );
231cdf0e10cSrcweir }
232cdf0e10cSrcweir }
233cdf0e10cSrcweir }
234cdf0e10cSrcweir }
235cdf0e10cSrcweir return rtl::OUString( URL );
236cdf0e10cSrcweir }
237cdf0e10cSrcweir
238cdf0e10cSrcweir //=========================================================================
239cdf0e10cSrcweir // lang::XServiceInfo
240cdf0e10cSrcweir //=========================================================================
241cdf0e10cSrcweir
242cdf0e10cSrcweir // virtual
243cdf0e10cSrcweir rtl::OUString SAL_CALL
getImplementationName()244cdf0e10cSrcweir OfficeInstallationDirectories::getImplementationName()
245cdf0e10cSrcweir throw ( uno::RuntimeException )
246cdf0e10cSrcweir {
247cdf0e10cSrcweir return getImplementationName_static();
248cdf0e10cSrcweir }
249cdf0e10cSrcweir
250cdf0e10cSrcweir //=========================================================================
251cdf0e10cSrcweir // virtual
252cdf0e10cSrcweir sal_Bool SAL_CALL
supportsService(const rtl::OUString & ServiceName)253cdf0e10cSrcweir OfficeInstallationDirectories::supportsService( const rtl::OUString& ServiceName )
254cdf0e10cSrcweir throw ( uno::RuntimeException )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir const uno::Sequence< rtl::OUString > & aNames
257cdf0e10cSrcweir = getSupportedServiceNames();
258cdf0e10cSrcweir const rtl::OUString * p = aNames.getConstArray();
259cdf0e10cSrcweir for ( sal_Int32 nPos = 0; nPos < aNames.getLength(); nPos++ )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir if ( p[ nPos ].equals( ServiceName ) )
262cdf0e10cSrcweir return sal_True;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir return sal_False;
265cdf0e10cSrcweir
266cdf0e10cSrcweir }
267cdf0e10cSrcweir
268cdf0e10cSrcweir //=========================================================================
269cdf0e10cSrcweir // virtual
270cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL
getSupportedServiceNames()271cdf0e10cSrcweir OfficeInstallationDirectories::getSupportedServiceNames()
272cdf0e10cSrcweir throw ( uno::RuntimeException )
273cdf0e10cSrcweir {
274cdf0e10cSrcweir return getSupportedServiceNames_static();
275cdf0e10cSrcweir }
276cdf0e10cSrcweir
277cdf0e10cSrcweir //=========================================================================
278cdf0e10cSrcweir // static
279cdf0e10cSrcweir rtl::OUString SAL_CALL
getImplementationName_static()280cdf0e10cSrcweir OfficeInstallationDirectories::getImplementationName_static()
281cdf0e10cSrcweir {
282cdf0e10cSrcweir return rtl::OUString(
283cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(
284cdf0e10cSrcweir "com.sun.star.comp.util.OfficeInstallationDirectories" ) );
285cdf0e10cSrcweir }
286cdf0e10cSrcweir
287cdf0e10cSrcweir //=========================================================================
288cdf0e10cSrcweir // static
289cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL
getSupportedServiceNames_static()290cdf0e10cSrcweir OfficeInstallationDirectories::getSupportedServiceNames_static()
291cdf0e10cSrcweir {
292cdf0e10cSrcweir const rtl::OUString aServiceName(
293cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(
294cdf0e10cSrcweir "com.sun.star.util.OfficeInstallationDirectories" ) );
295cdf0e10cSrcweir return uno::Sequence< rtl::OUString >( &aServiceName, 1 );
296cdf0e10cSrcweir }
297cdf0e10cSrcweir
298cdf0e10cSrcweir //=========================================================================
299cdf0e10cSrcweir // static
getSingletonName_static()300cdf0e10cSrcweir rtl::OUString SAL_CALL OfficeInstallationDirectories::getSingletonName_static()
301cdf0e10cSrcweir {
302cdf0e10cSrcweir return rtl::OUString(
303cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(
304cdf0e10cSrcweir "com.sun.star.util.theOfficeInstallationDirectories" ) );
305cdf0e10cSrcweir }
306cdf0e10cSrcweir
307cdf0e10cSrcweir //=========================================================================
308cdf0e10cSrcweir // static
309cdf0e10cSrcweir uno::Reference< uno::XInterface > SAL_CALL
Create(const uno::Reference<uno::XComponentContext> & rxContext)310cdf0e10cSrcweir OfficeInstallationDirectories::Create(
311cdf0e10cSrcweir const uno::Reference< uno::XComponentContext > & rxContext )
312cdf0e10cSrcweir {
313cdf0e10cSrcweir return static_cast< cppu::OWeakObject * >(
314cdf0e10cSrcweir new OfficeInstallationDirectories( rxContext ) );
315cdf0e10cSrcweir }
316cdf0e10cSrcweir
317cdf0e10cSrcweir //=========================================================================
318cdf0e10cSrcweir // non-UNO
319cdf0e10cSrcweir //=========================================================================
320cdf0e10cSrcweir
initDirs()321cdf0e10cSrcweir void OfficeInstallationDirectories::initDirs()
322cdf0e10cSrcweir {
323cdf0e10cSrcweir if ( m_pOfficeBrandDir == 0 )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex );
326cdf0e10cSrcweir if ( m_pOfficeBrandDir == 0 )
327cdf0e10cSrcweir {
328cdf0e10cSrcweir m_pOfficeBrandDir = new rtl::OUString;
329cdf0e10cSrcweir m_pOfficeBaseDir = new rtl::OUString;
330cdf0e10cSrcweir m_pUserDir = new rtl::OUString;
331cdf0e10cSrcweir
332cdf0e10cSrcweir uno::Reference< util::XMacroExpander > xExpander;
333cdf0e10cSrcweir
334cdf0e10cSrcweir m_xCtx->getValueByName(
335cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
336cdf0e10cSrcweir "/singletons/com.sun.star.util.theMacroExpander" ) ) )
337cdf0e10cSrcweir >>= xExpander;
338cdf0e10cSrcweir
339cdf0e10cSrcweir OSL_ENSURE( xExpander.is(),
340cdf0e10cSrcweir "Unable to obtain macro expander singleton!" );
341cdf0e10cSrcweir
342cdf0e10cSrcweir if ( xExpander.is() )
343cdf0e10cSrcweir {
344cdf0e10cSrcweir *m_pOfficeBrandDir =
345cdf0e10cSrcweir xExpander->expandMacros(
346910823aeSJürgen Schmidt rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR" ) ) );
347cdf0e10cSrcweir
348*49b34792SHerbert Dürr OSL_ENSURE( !m_pOfficeBrandDir->isEmpty(),
349cdf0e10cSrcweir "Unable to obtain office brand installation directory!" );
350cdf0e10cSrcweir
351cdf0e10cSrcweir makeCanonicalFileURL( *m_pOfficeBrandDir );
352cdf0e10cSrcweir
353910823aeSJürgen Schmidt *m_pOfficeBaseDir = *m_pOfficeBrandDir;
354910823aeSJürgen Schmidt // xExpander->expandMacros(
355910823aeSJürgen Schmidt // rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
356910823aeSJürgen Schmidt // "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":BaseInstallation}" ) ) );
357cdf0e10cSrcweir
358910823aeSJürgen Schmidt // OSL_ENSURE( m_pOfficeBaseDir->getLength() > 0,
359910823aeSJürgen Schmidt // "Unable to obtain office base installation directory!" );
360cdf0e10cSrcweir
361cdf0e10cSrcweir makeCanonicalFileURL( *m_pOfficeBaseDir );
362cdf0e10cSrcweir
363cdf0e10cSrcweir *m_pUserDir =
364cdf0e10cSrcweir xExpander->expandMacros(
365cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
366910823aeSJürgen Schmidt "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":UserInstallation}" ) ) );
367cdf0e10cSrcweir
368*49b34792SHerbert Dürr OSL_ENSURE( !m_pUserDir->isEmpty(),
369cdf0e10cSrcweir "Unable to obtain office user data directory!" );
370cdf0e10cSrcweir
371cdf0e10cSrcweir makeCanonicalFileURL( *m_pUserDir );
372cdf0e10cSrcweir }
373cdf0e10cSrcweir }
374cdf0e10cSrcweir }
375cdf0e10cSrcweir }
376cdf0e10cSrcweir
createRegistryInfo_OfficeInstallationDirectories()377cdf0e10cSrcweir void createRegistryInfo_OfficeInstallationDirectories()
378cdf0e10cSrcweir {
379cdf0e10cSrcweir static ::comphelper::module::OSingletonRegistration< OfficeInstallationDirectories > aAutoRegistration;
380cdf0e10cSrcweir }
381