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 //=========================================================================
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 
72cdf0e10cSrcweir                 if ( aNormalizedURL.getLength() > 0 )
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 
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
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
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
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
146cdf0e10cSrcweir OfficeInstallationDirectories::makeRelocatableURL( const rtl::OUString& URL )
147cdf0e10cSrcweir     throw ( uno::RuntimeException )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir     if ( URL.getLength() > 0 )
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
193cdf0e10cSrcweir OfficeInstallationDirectories::makeAbsoluteURL( const rtl::OUString& URL )
194cdf0e10cSrcweir     throw ( uno::RuntimeException )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir     if ( URL.getLength() > 0 )
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
244cdf0e10cSrcweir OfficeInstallationDirectories::getImplementationName()
245cdf0e10cSrcweir     throw ( uno::RuntimeException )
246cdf0e10cSrcweir {
247cdf0e10cSrcweir     return getImplementationName_static();
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir //=========================================================================
251cdf0e10cSrcweir // virtual
252cdf0e10cSrcweir sal_Bool SAL_CALL
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
271cdf0e10cSrcweir OfficeInstallationDirectories::getSupportedServiceNames()
272cdf0e10cSrcweir     throw ( uno::RuntimeException )
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     return getSupportedServiceNames_static();
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir //=========================================================================
278cdf0e10cSrcweir // static
279cdf0e10cSrcweir rtl::OUString SAL_CALL
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
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
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
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 
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(
346*910823aeSJürgen Schmidt                          rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR" ) ) );
347cdf0e10cSrcweir 
348cdf0e10cSrcweir                 OSL_ENSURE( m_pOfficeBrandDir->getLength() > 0,
349cdf0e10cSrcweir                             "Unable to obtain office brand installation directory!" );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir                 makeCanonicalFileURL( *m_pOfficeBrandDir );
352cdf0e10cSrcweir 
353*910823aeSJürgen Schmidt                 *m_pOfficeBaseDir = *m_pOfficeBrandDir;
354*910823aeSJürgen Schmidt                 //     xExpander->expandMacros(
355*910823aeSJürgen Schmidt                 //         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
356*910823aeSJürgen Schmidt                 //             "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":BaseInstallation}" ) ) );
357cdf0e10cSrcweir 
358*910823aeSJürgen Schmidt                 // OSL_ENSURE( m_pOfficeBaseDir->getLength() > 0,
359*910823aeSJü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(
366*910823aeSJürgen Schmidt                             "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":UserInstallation}" ) ) );
367cdf0e10cSrcweir 
368cdf0e10cSrcweir                 OSL_ENSURE( m_pUserDir->getLength() > 0,
369cdf0e10cSrcweir                             "Unable to obtain office user data directory!" );
370cdf0e10cSrcweir 
371cdf0e10cSrcweir                 makeCanonicalFileURL( *m_pUserDir );
372cdf0e10cSrcweir             }
373cdf0e10cSrcweir         }
374cdf0e10cSrcweir     }
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir void createRegistryInfo_OfficeInstallationDirectories()
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     static ::comphelper::module::OSingletonRegistration< OfficeInstallationDirectories > aAutoRegistration;
380cdf0e10cSrcweir }
381