xref: /AOO42X/main/extensions/source/mozbootstrap/MNSFolders.cxx (revision 30acf5e801d38c3701bf451b42e514ce81855b4c)
16a653dafSJuergen Schmidt /**************************************************************
26a653dafSJuergen Schmidt  *
36a653dafSJuergen Schmidt  * Licensed to the Apache Software Foundation (ASF) under one
46a653dafSJuergen Schmidt  * or more contributor license agreements.  See the NOTICE file
56a653dafSJuergen Schmidt  * distributed with this work for additional information
66a653dafSJuergen Schmidt  * regarding copyright ownership.  The ASF licenses this file
76a653dafSJuergen Schmidt  * to you under the Apache License, Version 2.0 (the
86a653dafSJuergen Schmidt  * "License"); you may not use this file except in compliance
96a653dafSJuergen Schmidt  * with the License.  You may obtain a copy of the License at
106a653dafSJuergen Schmidt  *
116a653dafSJuergen Schmidt  *   http://www.apache.org/licenses/LICENSE-2.0
126a653dafSJuergen Schmidt  *
136a653dafSJuergen Schmidt  * Unless required by applicable law or agreed to in writing,
146a653dafSJuergen Schmidt  * software distributed under the License is distributed on an
156a653dafSJuergen Schmidt  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166a653dafSJuergen Schmidt  * KIND, either express or implied.  See the License for the
176a653dafSJuergen Schmidt  * specific language governing permissions and limitations
186a653dafSJuergen Schmidt  * under the License.
196a653dafSJuergen Schmidt  *
206a653dafSJuergen Schmidt  *************************************************************/
216a653dafSJuergen Schmidt 
226a653dafSJuergen Schmidt // MARKER(update_precomp.py): autogen include statement, do not remove
236a653dafSJuergen Schmidt #include "precompiled_extensions.hxx"
246a653dafSJuergen Schmidt #include <MNSFolders.hxx>
256a653dafSJuergen Schmidt 
266a653dafSJuergen Schmidt #ifdef UNIX
276a653dafSJuergen Schmidt #include <sys/types.h>
286a653dafSJuergen Schmidt #include <strings.h>
296a653dafSJuergen Schmidt #include <string.h>
306a653dafSJuergen Schmidt #endif // End UNIX
316a653dafSJuergen Schmidt 
326a653dafSJuergen Schmidt #ifdef WNT
336a653dafSJuergen Schmidt #include "pre_include_windows.h"
346a653dafSJuergen Schmidt #include <windows.h>
356a653dafSJuergen Schmidt #include <stdlib.h>
366a653dafSJuergen Schmidt #include <shlobj.h>
376a653dafSJuergen Schmidt #include <objidl.h>
386a653dafSJuergen Schmidt #include "post_include_windows.h"
396a653dafSJuergen Schmidt #endif // End WNT
406a653dafSJuergen Schmidt #include <osl/security.hxx>
416a653dafSJuergen Schmidt #include <osl/file.hxx>
426a653dafSJuergen Schmidt #include <osl/thread.h>
436a653dafSJuergen Schmidt 
446a653dafSJuergen Schmidt using namespace ::com::sun::star::mozilla;
456a653dafSJuergen Schmidt 
466a653dafSJuergen Schmidt namespace
476a653dafSJuergen Schmidt {
486a653dafSJuergen Schmidt     // -------------------------------------------------------------------
lcl_getUserDataDirectory()496a653dafSJuergen Schmidt     static ::rtl::OUString lcl_getUserDataDirectory()
506a653dafSJuergen Schmidt     {
516a653dafSJuergen Schmidt         ::osl::Security   aSecurity;
526a653dafSJuergen Schmidt         ::rtl::OUString   aConfigPath;
536a653dafSJuergen Schmidt 
546a653dafSJuergen Schmidt         aSecurity.getConfigDir( aConfigPath );
556a653dafSJuergen Schmidt         return aConfigPath + ::rtl::OUString::createFromAscii( "/" );
566a653dafSJuergen Schmidt     }
576a653dafSJuergen Schmidt 
586a653dafSJuergen Schmidt     // -------------------------------------------------------------------
596a653dafSJuergen Schmidt     static const char* DefaultProductDir[3][3] =
606a653dafSJuergen Schmidt     {
616a653dafSJuergen Schmidt     #if defined(XP_WIN)
626a653dafSJuergen Schmidt         { "Mozilla/SeaMonkey/", NULL, NULL },
636a653dafSJuergen Schmidt         { "Mozilla/Firefox/", NULL, NULL },
646a653dafSJuergen Schmidt         { "Thunderbird/", "Mozilla/Thunderbird/", NULL }
656a653dafSJuergen Schmidt     #elif(MACOSX)
666a653dafSJuergen Schmidt         { "../Mozilla/SeaMonkey/", NULL, NULL },
676a653dafSJuergen Schmidt         { "Firefox/", NULL, NULL },
686a653dafSJuergen Schmidt         { "../Thunderbird/", NULL, NULL }
696a653dafSJuergen Schmidt     #else
706a653dafSJuergen Schmidt         { ".mozilla/seamonkey/", NULL, NULL },
716a653dafSJuergen Schmidt         { ".mozilla/firefox/", NULL, NULL },
726a653dafSJuergen Schmidt         { ".thunderbird/", ".mozilla-thunderbird/", ".mozilla/thunderbird/" }
736a653dafSJuergen Schmidt     #endif
746a653dafSJuergen Schmidt     };
756a653dafSJuergen Schmidt 
766a653dafSJuergen Schmidt     static const char* ProductRootEnvironmentVariable[3] =
776a653dafSJuergen Schmidt     {
786a653dafSJuergen Schmidt         "MOZILLA_PROFILE_ROOT",
796a653dafSJuergen Schmidt         "MOZILLA_FIREFOX_PROFILE_ROOT",
806a653dafSJuergen Schmidt         "MOZILLA_THUNDERBIRD_PROFILE_ROOT",
816a653dafSJuergen Schmidt     };
826a653dafSJuergen Schmidt 
836a653dafSJuergen Schmidt     // -------------------------------------------------------------------
lcl_guessProfileRoot(MozillaProductType _product)846a653dafSJuergen Schmidt     static ::rtl::OUString lcl_guessProfileRoot( MozillaProductType _product )
856a653dafSJuergen Schmidt     {
866a653dafSJuergen Schmidt         size_t productIndex = _product - 1;
876a653dafSJuergen Schmidt 
886a653dafSJuergen Schmidt         static ::rtl::OUString s_productDirectories[3];
896a653dafSJuergen Schmidt 
906a653dafSJuergen Schmidt         if ( !s_productDirectories[ productIndex ].getLength() )
916a653dafSJuergen Schmidt         {
926a653dafSJuergen Schmidt             ::rtl::OUString sProductPath;
936a653dafSJuergen Schmidt 
946a653dafSJuergen Schmidt             // check whether we have an anevironment variable which helps us
956a653dafSJuergen Schmidt             const char* pProfileByEnv = getenv( ProductRootEnvironmentVariable[ productIndex ] );
966a653dafSJuergen Schmidt             if ( pProfileByEnv )
976a653dafSJuergen Schmidt             {
986a653dafSJuergen Schmidt                 sProductPath = ::rtl::OUString( pProfileByEnv, rtl_str_getLength( pProfileByEnv ), osl_getThreadTextEncoding() );
99*30acf5e8Spfg                 // assume that this is fine, no further checks
1006a653dafSJuergen Schmidt             }
1016a653dafSJuergen Schmidt             else
1026a653dafSJuergen Schmidt             {
1036a653dafSJuergen Schmidt                 ::rtl::OUString sProductDirCandidate;
1046a653dafSJuergen Schmidt                 const char* pProfileRegistry = "profiles.ini";
1056a653dafSJuergen Schmidt 
1066a653dafSJuergen Schmidt                 // check all possible candidates
1076a653dafSJuergen Schmidt                 for ( size_t i=0; i<3; ++i )
1086a653dafSJuergen Schmidt                 {
1096a653dafSJuergen Schmidt                     if ( NULL == DefaultProductDir[ productIndex ][ i ] )
1106a653dafSJuergen Schmidt                         break;
1116a653dafSJuergen Schmidt 
1126a653dafSJuergen Schmidt                     sProductDirCandidate = lcl_getUserDataDirectory() +
1136a653dafSJuergen Schmidt                         ::rtl::OUString::createFromAscii( DefaultProductDir[ productIndex ][ i ] );
1146a653dafSJuergen Schmidt 
1156a653dafSJuergen Schmidt                     // check existence
1166a653dafSJuergen Schmidt                     ::osl::DirectoryItem aRegistryItem;
1176a653dafSJuergen Schmidt                     ::osl::FileBase::RC result = ::osl::DirectoryItem::get( sProductDirCandidate + ::rtl::OUString::createFromAscii( pProfileRegistry ), aRegistryItem );
1186a653dafSJuergen Schmidt                     if ( result == ::osl::FileBase::E_None  )
1196a653dafSJuergen Schmidt                     {
1206a653dafSJuergen Schmidt                         ::osl::FileStatus aStatus( FileStatusMask_Validate );
1216a653dafSJuergen Schmidt                         result = aRegistryItem.getFileStatus( aStatus );
1226a653dafSJuergen Schmidt                         if ( result == ::osl::FileBase::E_None  )
1236a653dafSJuergen Schmidt                         {
1246a653dafSJuergen Schmidt                             // the registry file exists
1256a653dafSJuergen Schmidt                             break;
1266a653dafSJuergen Schmidt                         }
1276a653dafSJuergen Schmidt                     }
1286a653dafSJuergen Schmidt                 }
1296a653dafSJuergen Schmidt 
1306a653dafSJuergen Schmidt                 ::osl::FileBase::getSystemPathFromFileURL( sProductDirCandidate, sProductPath );
1316a653dafSJuergen Schmidt             }
1326a653dafSJuergen Schmidt 
1336a653dafSJuergen Schmidt             s_productDirectories[ productIndex ] = sProductPath;
1346a653dafSJuergen Schmidt         }
1356a653dafSJuergen Schmidt 
1366a653dafSJuergen Schmidt         return s_productDirectories[ productIndex ];
1376a653dafSJuergen Schmidt     }
1386a653dafSJuergen Schmidt }
1396a653dafSJuergen Schmidt 
1406a653dafSJuergen Schmidt // -----------------------------------------------------------------------
getRegistryDir(MozillaProductType product)1416a653dafSJuergen Schmidt ::rtl::OUString getRegistryDir(MozillaProductType product)
1426a653dafSJuergen Schmidt {
1436a653dafSJuergen Schmidt     if (product == MozillaProductType_Default)
1446a653dafSJuergen Schmidt         return ::rtl::OUString();
1456a653dafSJuergen Schmidt 
1466a653dafSJuergen Schmidt     return lcl_guessProfileRoot( product );
1476a653dafSJuergen Schmidt }
148