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