xref: /trunk/main/unotools/source/config/defaultoptions.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_unotools.hxx"
30 
31 #include <unotools/defaultoptions.hxx>
32 #include <unotools/pathoptions.hxx>
33 #include <unotools/configitem.hxx>
34 #include <unotools/configmgr.hxx>
35 #include <tools/debug.hxx>
36 #include <tools/resmgr.hxx>
37 #include <tools/urlobj.hxx>
38 #include <com/sun/star/uno/Any.hxx>
39 #include <com/sun/star/uno/Sequence.hxx>
40 #include <osl/mutex.hxx>
41 
42 #include <vos/process.hxx>
43 #include <unotools/localfilehelper.hxx>
44 #include <rtl/instance.hxx>
45 
46 #include <itemholder1.hxx>
47 
48 using namespace osl;
49 using namespace utl;
50 using namespace rtl;
51 using namespace com::sun::star::uno;
52 
53 // define ----------------------------------------------------------------
54 
55 #define ASCII_STR(s)                OUString( RTL_CONSTASCII_USTRINGPARAM(s) )
56 
57 #define DEFAULTPATH__ADDIN          0
58 #define DEFAULTPATH__AUTOCORRECT    1
59 #define DEFAULTPATH__AUTOTEXT       2
60 #define DEFAULTPATH__BACKUP         3
61 #define DEFAULTPATH__BASIC          4
62 #define DEFAULTPATH__BITMAP         5
63 #define DEFAULTPATH__CONFIG         6
64 #define DEFAULTPATH__DICTIONARY     7
65 #define DEFAULTPATH__FAVORITES      8
66 #define DEFAULTPATH__FILTER         9
67 #define DEFAULTPATH__GALLERY        10
68 #define DEFAULTPATH__GRAPHIC        11
69 #define DEFAULTPATH__HELP           12
70 #define DEFAULTPATH__LINGUISTIC     13
71 #define DEFAULTPATH__MODULE         14
72 #define DEFAULTPATH__PALETTE        15
73 #define DEFAULTPATH__PLUGIN         16
74 #define DEFAULTPATH__TEMP           17
75 #define DEFAULTPATH__TEMPLATE       18
76 #define DEFAULTPATH__USERCONFIG     19
77 #define DEFAULTPATH__WORK           20
78 #define DEFAULTPATH__USERDICTIONARY 21
79 
80 // class SvtDefaultOptions_Impl ------------------------------------------
81 
82 class SvtDefaultOptions_Impl : public utl::ConfigItem
83 {
84 public:
85     String          m_aAddinPath;
86     String          m_aAutoCorrectPath;
87     String          m_aAutoTextPath;
88     String          m_aBackupPath;
89     String          m_aBasicPath;
90     String          m_aBitmapPath;
91     String          m_aConfigPath;
92     String          m_aDictionaryPath;
93     String          m_aFavoritesPath;
94     String          m_aFilterPath;
95     String          m_aGalleryPath;
96     String          m_aGraphicPath;
97     String          m_aHelpPath;
98     String          m_aLinguisticPath;
99     String          m_aModulePath;
100     String          m_aPalettePath;
101     String          m_aPluginPath;
102     String          m_aTempPath;
103     String          m_aTemplatePath;
104     String          m_aUserConfigPath;
105     String          m_aWorkPath;
106     String          m_aUserDictionaryPath;
107 
108                     SvtDefaultOptions_Impl();
109 
110     String          GetDefaultPath( sal_uInt16 nId ) const;
111     virtual void    Commit();
112     virtual void    Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames);
113 };
114 
115 // global ----------------------------------------------------------------
116 
117 static SvtDefaultOptions_Impl*  pOptions = NULL;
118 static sal_Int32                nRefCount = 0;
119 
120 typedef String SvtDefaultOptions_Impl:: *PathStrPtr;
121 
122 struct PathToDefaultMapping_Impl
123 {
124     SvtPathOptions::Pathes  _ePath;
125     PathStrPtr              _pDefaultPath;
126 };
127 
128 static PathToDefaultMapping_Impl __READONLY_DATA PathMap_Impl[] =
129 {
130     { SvtPathOptions::PATH_ADDIN,           &SvtDefaultOptions_Impl::m_aAddinPath },
131     { SvtPathOptions::PATH_AUTOCORRECT,     &SvtDefaultOptions_Impl::m_aAutoCorrectPath },
132     { SvtPathOptions::PATH_AUTOTEXT,        &SvtDefaultOptions_Impl::m_aAutoTextPath },
133     { SvtPathOptions::PATH_BACKUP,          &SvtDefaultOptions_Impl::m_aBackupPath },
134     { SvtPathOptions::PATH_BASIC,           &SvtDefaultOptions_Impl::m_aBasicPath },
135     { SvtPathOptions::PATH_BITMAP,          &SvtDefaultOptions_Impl::m_aBitmapPath },
136     { SvtPathOptions::PATH_CONFIG,          &SvtDefaultOptions_Impl::m_aConfigPath },
137     { SvtPathOptions::PATH_DICTIONARY,      &SvtDefaultOptions_Impl::m_aDictionaryPath },
138     { SvtPathOptions::PATH_FAVORITES,       &SvtDefaultOptions_Impl::m_aFavoritesPath },
139     { SvtPathOptions::PATH_FILTER,          &SvtDefaultOptions_Impl::m_aFilterPath },
140     { SvtPathOptions::PATH_GALLERY,         &SvtDefaultOptions_Impl::m_aGalleryPath },
141     { SvtPathOptions::PATH_GRAPHIC,         &SvtDefaultOptions_Impl::m_aGraphicPath },
142     { SvtPathOptions::PATH_HELP,            &SvtDefaultOptions_Impl::m_aHelpPath },
143     { SvtPathOptions::PATH_LINGUISTIC,      &SvtDefaultOptions_Impl::m_aLinguisticPath },
144     { SvtPathOptions::PATH_MODULE,          &SvtDefaultOptions_Impl::m_aModulePath },
145     { SvtPathOptions::PATH_PALETTE,         &SvtDefaultOptions_Impl::m_aPalettePath },
146     { SvtPathOptions::PATH_PLUGIN,          &SvtDefaultOptions_Impl::m_aPluginPath },
147     { SvtPathOptions::PATH_TEMP,            &SvtDefaultOptions_Impl::m_aTempPath },
148     { SvtPathOptions::PATH_TEMPLATE,        &SvtDefaultOptions_Impl::m_aTemplatePath },
149     { SvtPathOptions::PATH_USERCONFIG,      &SvtDefaultOptions_Impl::m_aUserConfigPath },
150     { SvtPathOptions::PATH_WORK,            &SvtDefaultOptions_Impl::m_aWorkPath }
151 };
152 
153 // functions -------------------------------------------------------------
154 
155 Sequence< OUString > GetDefaultPropertyNames()
156 {
157     static const char* aPropNames[] =
158     {
159         "Addin",            // PATH_ADDIN
160         "AutoCorrect",      // PATH_AUTOCORRECT
161         "AutoText",         // PATH_AUTOTEXT
162         "Backup",           // PATH_BACKUP
163         "Basic",            // PATH_BASIC
164         "Bitmap",           // PATH_BITMAP
165         "Config",           // PATH_CONFIG
166         "Dictionary",       // PATH_DICTIONARY
167         "Favorite",         // PATH_FAVORITES
168         "Filter",           // PATH_FILTER
169         "Gallery",          // PATH_GALLERY
170         "Graphic",          // PATH_GRAPHIC
171         "Help",             // PATH_HELP
172         "Linguistic",       // PATH_LINGUISTIC
173         "Module",           // PATH_MODULE
174         "Palette",          // PATH_PALETTE
175         "Plugin",           // PATH_PLUGIN
176         "Temp",             // PATH_TEMP
177         "Template",         // PATH_TEMPLATE
178         "UserConfig",       // PATH_USERCONFIG
179         "Work"              // PATH_WORK
180     };
181 
182     const int nCount = sizeof( aPropNames ) / sizeof( const char* );
183     Sequence< OUString > aNames( nCount );
184     OUString* pNames = aNames.getArray();
185     for ( int i = 0; i < nCount; i++ )
186         pNames[i] = OUString::createFromAscii( aPropNames[i] );
187 
188     return aNames;
189 }
190 
191 void SvtDefaultOptions_Impl::Notify( const Sequence< rtl::OUString >&  )
192 {
193     // no notification, will never be changed
194 }
195 
196 void SvtDefaultOptions_Impl::Commit()
197 {
198     // will never be changed
199 }
200 
201 // class SvtDefaultOptions_Impl ------------------------------------------
202 
203 String SvtDefaultOptions_Impl::GetDefaultPath( sal_uInt16 nId ) const
204 {
205     String aRet;
206     sal_uInt16 nIdx = 0;
207 
208     while ( PathMap_Impl[nIdx]._ePath <= SvtPathOptions::PATH_WORK )
209     {
210         if ( nId == PathMap_Impl[nIdx]._ePath && PathMap_Impl[nIdx]._pDefaultPath )
211         {
212             aRet = this->*(PathMap_Impl[nIdx]._pDefaultPath);
213             if ( nId == SvtPathOptions::PATH_ADDIN ||
214                  nId == SvtPathOptions::PATH_FILTER ||
215                  nId == SvtPathOptions::PATH_HELP ||
216                  nId == SvtPathOptions::PATH_MODULE ||
217                  nId == SvtPathOptions::PATH_PLUGIN )
218             {
219                 String aTmp;
220                 ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aRet, aTmp );
221                 aRet = aTmp;
222             }
223 
224             break;
225         }
226         ++nIdx;
227     }
228 
229     return aRet;
230 }
231 
232 // -----------------------------------------------------------------------
233 
234 SvtDefaultOptions_Impl::SvtDefaultOptions_Impl() : ConfigItem( ASCII_STR("Office.Common/Path/Default") )
235 {
236     /*ConfigManager* pCfgMgr =*/ ConfigManager::GetConfigManager();
237     Sequence< OUString > aNames = GetDefaultPropertyNames();
238     Sequence< Any > aValues = GetProperties( aNames );
239     EnableNotification( aNames );
240     const Any* pValues = aValues.getConstArray();
241     DBG_ASSERT( aValues.getLength() == aNames.getLength(), "GetProperties failed" );
242     if ( aValues.getLength() == aNames.getLength() )
243     {
244         SvtPathOptions aPathOpt;
245         OUString aTempStr, aFullPath;
246 
247         for ( int nProp = 0; nProp < aNames.getLength(); nProp++ )
248         {
249             if ( pValues[nProp].hasValue() )
250             {
251                 switch ( pValues[nProp].getValueTypeClass() )
252                 {
253                     case ::com::sun::star::uno::TypeClass_STRING :
254                     {
255                         // multi pathes
256                         if ( pValues[nProp] >>= aTempStr )
257                             aFullPath = aPathOpt.SubstituteVariable( aTempStr );
258                         else
259                         {
260                             DBG_ERRORFILE( "any operator >>= failed" );
261                         }
262                         break;
263                     }
264 
265                     case ::com::sun::star::uno::TypeClass_SEQUENCE :
266                     {
267                         // single pathes
268                         aFullPath = OUString();
269                         Sequence < OUString > aList;
270                         if ( pValues[nProp] >>= aList )
271                         {
272                             sal_Int32 nCount = aList.getLength();
273                             for ( sal_Int32 nPosition = 0; nPosition < nCount; ++nPosition )
274                             {
275                                 aTempStr = aPathOpt.SubstituteVariable( aList[ nPosition ] );
276                                 aFullPath += aTempStr;
277                                 if ( nPosition < nCount-1 )
278                                     aFullPath += OUString( RTL_CONSTASCII_USTRINGPARAM(";") );
279                             }
280                         }
281                         else
282                         {
283                             DBG_ERRORFILE( "any operator >>= failed" );
284                         }
285                         break;
286                     }
287 
288                     default:
289                     {
290                         DBG_ERRORFILE( "Wrong any type" );
291                     }
292                 }
293 
294                 switch ( nProp )
295                 {
296                     case DEFAULTPATH__ADDIN:            m_aAddinPath = String( aFullPath );         break;
297                     case DEFAULTPATH__AUTOCORRECT:      m_aAutoCorrectPath = String( aFullPath );   break;
298                     case DEFAULTPATH__AUTOTEXT:         m_aAutoTextPath = String( aFullPath );      break;
299                     case DEFAULTPATH__BACKUP:           m_aBackupPath = String( aFullPath );        break;
300                     case DEFAULTPATH__BASIC:            m_aBasicPath = String( aFullPath );         break;
301                     case DEFAULTPATH__BITMAP:           m_aBitmapPath = String( aFullPath );        break;
302                     case DEFAULTPATH__CONFIG:           m_aConfigPath = String( aFullPath );        break;
303                     case DEFAULTPATH__DICTIONARY:       m_aDictionaryPath = String( aFullPath );    break;
304                     case DEFAULTPATH__FAVORITES:        m_aFavoritesPath = String( aFullPath );     break;
305                     case DEFAULTPATH__FILTER:           m_aFilterPath = String( aFullPath );        break;
306                     case DEFAULTPATH__GALLERY:          m_aGalleryPath = String( aFullPath );       break;
307                     case DEFAULTPATH__GRAPHIC:          m_aGraphicPath = String( aFullPath );       break;
308                     case DEFAULTPATH__HELP:             m_aHelpPath = String( aFullPath );          break;
309                     case DEFAULTPATH__LINGUISTIC:       m_aLinguisticPath = String( aFullPath );    break;
310                     case DEFAULTPATH__MODULE:           m_aModulePath = String( aFullPath );        break;
311                     case DEFAULTPATH__PALETTE:          m_aPalettePath = String( aFullPath );       break;
312                     case DEFAULTPATH__PLUGIN:           m_aPluginPath = String( aFullPath );        break;
313                     case DEFAULTPATH__TEMP:             m_aTempPath = String( aFullPath );          break;
314                     case DEFAULTPATH__TEMPLATE:         m_aTemplatePath = String( aFullPath );      break;
315                     case DEFAULTPATH__USERCONFIG:       m_aUserConfigPath = String( aFullPath );    break;
316                     case DEFAULTPATH__WORK:             m_aWorkPath = String( aFullPath );          break;
317                     case DEFAULTPATH__USERDICTIONARY:   m_aUserDictionaryPath = String( aFullPath );break;
318 
319                     default:
320                         DBG_ERRORFILE( "invalid index to load a default path" );
321                 }
322             }
323         }
324     }
325 }
326 
327 // class SvtDefaultOptions -----------------------------------------------
328 namespace { struct lclMutex : public rtl::Static< ::osl::Mutex, lclMutex > {}; }
329 
330 SvtDefaultOptions::SvtDefaultOptions()
331 {
332     // Global access, must be guarded (multithreading)
333     ::osl::MutexGuard aGuard( lclMutex::get() );
334     if ( !pOptions )
335     {
336         pOptions = new SvtDefaultOptions_Impl;
337         ItemHolder1::holdConfigItem(E_DEFAULTOPTIONS);
338     }
339     ++nRefCount;
340     pImp = pOptions;
341 }
342 
343 // -----------------------------------------------------------------------
344 
345 SvtDefaultOptions::~SvtDefaultOptions()
346 {
347     // Global access, must be guarded (multithreading)
348     ::osl::MutexGuard aGuard( lclMutex::get() );
349     if ( !--nRefCount )
350     {
351         if ( pOptions->IsModified() )
352             pOptions->Commit();
353         DELETEZ( pOptions );
354     }
355 }
356 
357 // -----------------------------------------------------------------------
358 
359 String SvtDefaultOptions::GetDefaultPath( sal_uInt16 nId ) const
360 {
361     return pImp->GetDefaultPath( nId );
362 }
363 
364