LCOV - code coverage report
Current view: top level - connectivity/source/drivers/mozab/bootstrap - MNSProfileDiscover.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 100 0.0 %
Date: 2012-08-25 Functions: 0 13 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : 
      20                 :            : 
      21                 :            : #include "MNSProfileDiscover.hxx"
      22                 :            : #ifndef MINIMAL_PROFILEDISCOVER
      23                 :            : #include "MNSProfile.hxx"
      24                 :            : 
      25                 :            : #include "pratom.h"
      26                 :            : #include "prmem.h"
      27                 :            : #include "plstr.h"
      28                 :            : #include "prenv.h"
      29                 :            : 
      30                 :            : #include "nsIEnumerator.h"
      31                 :            : #include "prprf.h"
      32                 :            : #include "nsCOMPtr.h"
      33                 :            : #include "nsIComponentManager.h"
      34                 :            : #include "nsEscape.h"
      35                 :            : #include "nsDirectoryServiceDefs.h"
      36                 :            : #include "nsAppDirectoryServiceDefs.h"
      37                 :            : #include "nsILocalFile.h"
      38                 :            : #include "nsReadableUtils.h"
      39                 :            : 
      40                 :            : 
      41                 :            : #if defined(XP_MAC) || defined(XP_MACOSX)
      42                 :            : #include <Processes.h>
      43                 :            : #include <CFBundle.h>
      44                 :            : #include "nsILocalFileMac.h"
      45                 :            : #endif
      46                 :            : 
      47                 :            : #ifdef XP_UNIX
      48                 :            : #include <unistd.h>
      49                 :            : #include <fcntl.h>
      50                 :            : #include <errno.h>
      51                 :            : #include <signal.h>
      52                 :            : #include "prnetdb.h"
      53                 :            : #include "prsystem.h"
      54                 :            : #endif
      55                 :            : 
      56                 :            : #ifdef VMS
      57                 :            : #include <rmsdef.h>
      58                 :            : #endif
      59                 :            : 
      60                 :            : #include "pre_include_mozilla.h"
      61                 :            : #include "nsICharsetConverterManager.h"
      62                 :            : #include "nsIPlatformCharset.h"
      63                 :            : #include "post_include_mozilla.h"
      64                 :            : 
      65                 :            : #if defined (XP_UNIX)
      66                 :            : #   define USER_ENVIRONMENT_VARIABLE "USER"
      67                 :            : #   define LOGNAME_ENVIRONMENT_VARIABLE "LOGNAME"
      68                 :            : #   define HOME_ENVIRONMENT_VARIABLE "HOME"
      69                 :            : #   define PROFILE_NAME_ENVIRONMENT_VARIABLE "PROFILE_NAME"
      70                 :            : #   define PROFILE_HOME_ENVIRONMENT_VARIABLE "PROFILE_HOME"
      71                 :            : #   define DEFAULT_UNIX_PROFILE_NAME "default"
      72                 :            : #   ifndef XP_MACOSX   /* Don't use symlink-based locking on OS X */
      73                 :            : #       define USE_SYMLINK_LOCKING
      74                 :            : #   endif
      75                 :            : #endif
      76                 :            : 
      77                 :            : // IID and CIDs of all the services needed
      78                 :            : static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
      79                 :            : #endif
      80                 :            : 
      81                 :            : #ifndef MAXPATHLEN
      82                 :            : #define MAXPATHLEN 1024
      83                 :            : #endif
      84                 :            : #include <MNSFolders.hxx>
      85                 :            : #include <MNSINIParser.hxx>
      86                 :            : 
      87                 :            : namespace connectivity
      88                 :            : {
      89                 :            :     namespace mozab
      90                 :            :     {
      91                 :          0 :         ProfileStruct::ProfileStruct(MozillaProductType aProduct,::rtl::OUString aProfileName,
      92                 :            : #ifdef MINIMAL_PROFILEDISCOVER
      93                 :            :             const ::rtl::OUString& aProfilePath
      94                 :            : #else
      95                 :            :             nsILocalFile * aProfilePath
      96                 :            : #endif
      97                 :          0 :           )
      98                 :            :         {
      99                 :          0 :             product=aProduct;
     100                 :          0 :             profileName = aProfileName;
     101                 :          0 :             profilePath = aProfilePath;
     102                 :          0 :         }
     103                 :          0 :         ::rtl::OUString ProfileStruct::getProfilePath()
     104                 :            :         {
     105                 :            : #ifdef MINIMAL_PROFILEDISCOVER
     106                 :          0 :             return profilePath;
     107                 :            : #else
     108                 :            :             if (profilePath)
     109                 :            :             {
     110                 :            :                 nsAutoString path;
     111                 :            :                 nsresult rv = profilePath->GetPath(path);
     112                 :            :                 NS_ENSURE_SUCCESS(rv, ::rtl::OUString());
     113                 :            :                 // PRUnichar != sal_Unicode in mingw
     114                 :            :                 return ::rtl::OUString(reinterpret_cast_mingw_only<const sal_Unicode *>(path.get()));
     115                 :            :             }
     116                 :            :             else
     117                 :            :                 return ::rtl::OUString();
     118                 :            : #endif
     119                 :            :         }
     120                 :            : 
     121                 :          0 :         ProfileAccess::~ProfileAccess()
     122                 :            :         {
     123                 :          0 :         }
     124                 :          0 :         ProfileAccess::ProfileAccess()
     125                 :            :         {
     126                 :          0 :             LoadProductsInfo();
     127                 :          0 :         }
     128                 :            : 
     129                 :          0 :         sal_Int32 ProfileAccess::LoadProductsInfo()
     130                 :            :         {
     131                 :            :             //load SeaMonkey 2 profiles to m_ProductProfileList
     132                 :          0 :             sal_Int32 count = LoadXPToolkitProfiles(MozillaProductType_Mozilla);
     133                 :            : 
     134                 :            :             //load thunderbird profiles to m_ProductProfileList
     135                 :          0 :             count += LoadXPToolkitProfiles(MozillaProductType_Thunderbird);
     136                 :            : 
     137                 :            :             //load firefox profiles to m_ProductProfileList
     138                 :            :             //firefox profile does not containt address book, but maybe others need them
     139                 :          0 :             count += LoadXPToolkitProfiles(MozillaProductType_Firefox);
     140                 :          0 :             return count;
     141                 :            :         }
     142                 :            :         //Thunderbird and firefox profiles are saved in profiles.ini
     143                 :          0 :         sal_Int32 ProfileAccess::LoadXPToolkitProfiles(MozillaProductType product)
     144                 :            :         {
     145                 :          0 :             sal_Int32 index=product;
     146                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     147                 :            : 
     148                 :            : #ifndef MINIMAL_PROFILEDISCOVER
     149                 :            :             nsresult rv;
     150                 :            : #endif
     151                 :          0 :             ::rtl::OUString regDir = getRegistryDir(product);
     152                 :          0 :             ::rtl::OUString profilesIni( regDir );
     153                 :          0 :             profilesIni += ::rtl::OUString("profiles.ini");
     154                 :          0 :             IniParser parser( profilesIni );
     155                 :          0 :             IniSectionMap &mAllSection = *(parser.getAllSection());
     156                 :            : 
     157                 :          0 :             IniSectionMap::iterator iBegin = mAllSection.begin();
     158                 :          0 :             IniSectionMap::iterator iEnd = mAllSection.end();
     159                 :          0 :             for(;iBegin != iEnd;++iBegin)
     160                 :            :             {
     161                 :          0 :                 ini_Section *aSection = &(*iBegin).second;
     162                 :          0 :                 ::rtl::OUString profileName;
     163                 :          0 :                 ::rtl::OUString profilePath;
     164                 :          0 :                 ::rtl::OUString sIsRelative;
     165                 :          0 :                 ::rtl::OUString sIsDefault;
     166                 :            : 
     167                 :          0 :                 for(NameValueList::iterator itor=aSection->lList.begin();
     168                 :          0 :                     itor != aSection->lList.end();
     169                 :            :                     ++itor)
     170                 :            :                 {
     171                 :          0 :                         struct ini_NameValue * aValue = &(*itor);
     172                 :          0 :                         if ( aValue->sName == "Name" )
     173                 :            :                         {
     174                 :          0 :                             profileName = aValue->sValue;
     175                 :            :                         }
     176                 :          0 :                         else if ( aValue->sName == "IsRelative" )
     177                 :            :                         {
     178                 :          0 :                             sIsRelative = aValue->sValue;
     179                 :            :                         }
     180                 :          0 :                         else if ( aValue->sName == "Path" )
     181                 :            :                         {
     182                 :          0 :                             profilePath = aValue->sValue;
     183                 :            :                         }
     184                 :          0 :                         else if ( aValue->sName == "Default" )
     185                 :            :                         {
     186                 :          0 :                             sIsDefault = aValue->sValue;
     187                 :            :                         }
     188                 :            :                 }
     189                 :          0 :                 if (!(profileName.isEmpty() && profilePath.isEmpty()))
     190                 :            :                 {
     191                 :          0 :                     sal_Int32 isRelative = 0;
     192                 :          0 :                     if (!sIsRelative.isEmpty())
     193                 :            :                     {
     194                 :          0 :                         isRelative = sIsRelative.toInt32();
     195                 :            :                     }
     196                 :            : 
     197                 :            : #ifndef MINIMAL_PROFILEDISCOVER
     198                 :            :                     nsCOMPtr<nsILocalFile> rootDir;
     199                 :            :                     rv = NS_NewLocalFile(EmptyString(), PR_TRUE,
     200                 :            :                                             getter_AddRefs(rootDir));
     201                 :            :                     if (NS_FAILED(rv)) continue;
     202                 :            : 
     203                 :            :                     OString sPath = OUStringToOString(profilePath, RTL_TEXTENCODING_UTF8);
     204                 :            :                     nsCAutoString filePath(sPath.getStr());
     205                 :            : 
     206                 :            :                     if (isRelative) {
     207                 :            :                         // PRUnichar != sal_Unicode in mingw
     208                 :            :                         nsAutoString registryDir( reinterpret_cast_mingw_only<const PRUnichar *>(regDir.getStr()) );
     209                 :            :                         nsCOMPtr<nsILocalFile>     mAppData;
     210                 :            :                         rv = NS_NewLocalFile(registryDir, PR_TRUE,
     211                 :            :                                         getter_AddRefs(mAppData));
     212                 :            :                         if (NS_FAILED(rv)) continue;
     213                 :            :                         rv = rootDir->SetRelativeDescriptor(mAppData, filePath);
     214                 :            :                     } else {
     215                 :            :                         rv = rootDir->SetPersistentDescriptor(filePath);
     216                 :            :                     }
     217                 :            :                     if (NS_FAILED(rv)) continue;
     218                 :            : #else
     219                 :          0 :                     rtl::OUString fullProfilePath;
     220                 :          0 :                     if(isRelative)
     221                 :            :                     {
     222                 :          0 :                         fullProfilePath = regDir + profilePath;
     223                 :            :                     }
     224                 :            :                     else
     225                 :            :                     {
     226                 :          0 :                         fullProfilePath = profilePath;
     227                 :            :                     }
     228                 :            : #endif
     229                 :            : 
     230                 :            :                     ProfileStruct*  profileItem     = new ProfileStruct(product,profileName,
     231                 :            : #ifdef MINIMAL_PROFILEDISCOVER
     232                 :            :                             fullProfilePath
     233                 :            : #else
     234                 :            :                             rootDir
     235                 :            : #endif
     236                 :          0 :                         );
     237                 :          0 :                     m_Product.mProfileList[profileName] = profileItem;
     238                 :            : 
     239                 :          0 :                     sal_Int32 isDefault = 0;
     240                 :          0 :                     if (!sIsDefault.isEmpty())
     241                 :            :                     {
     242                 :          0 :                         isDefault = sIsDefault.toInt32();
     243                 :            :                     }
     244                 :          0 :                     if (isDefault)
     245                 :          0 :                         m_Product.mCurrentProfileName = profileName;
     246                 :            : 
     247                 :            :                 }
     248                 :            : 
     249                 :          0 :             }
     250                 :          0 :             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
     251                 :            :         }
     252                 :            : 
     253                 :          0 :         ::rtl::OUString ProfileAccess::getProfilePath( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
     254                 :            :         {
     255                 :          0 :             sal_Int32 index=product;
     256                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     257                 :          0 :             if (!m_Product.mProfileList.size() || m_Product.mProfileList.find(profileName) == m_Product.mProfileList.end())
     258                 :            :             {
     259                 :            :                 //Profile not found
     260                 :          0 :                 return ::rtl::OUString();
     261                 :            :             }
     262                 :            :             else
     263                 :          0 :                 return m_Product.mProfileList[profileName]->getProfilePath();
     264                 :            :         }
     265                 :            : 
     266                 :          0 :         ::sal_Int32 ProfileAccess::getProfileCount( ::com::sun::star::mozilla::MozillaProductType product) throw (::com::sun::star::uno::RuntimeException)
     267                 :            :         {
     268                 :          0 :             sal_Int32 index=product;
     269                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     270                 :          0 :             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
     271                 :            :         }
     272                 :          0 :         ::sal_Int32 ProfileAccess::getProfileList( ::com::sun::star::mozilla::MozillaProductType product, ::com::sun::star::uno::Sequence< ::rtl::OUString >& list ) throw (::com::sun::star::uno::RuntimeException)
     273                 :            :         {
     274                 :          0 :             sal_Int32 index=product;
     275                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     276                 :          0 :             list.realloc(static_cast<sal_Int32>(m_Product.mProfileList.size()));
     277                 :          0 :             sal_Int32 i=0;
     278                 :          0 :             for(ProfileList::iterator itor=m_Product.mProfileList.begin();
     279                 :          0 :                 itor != m_Product.mProfileList.end();
     280                 :            :                 ++itor)
     281                 :            :             {
     282                 :          0 :                 ProfileStruct * aProfile = (*itor).second;
     283                 :          0 :                 list[i] = aProfile->getProfileName();
     284                 :          0 :                 i++;
     285                 :            :             }
     286                 :            : 
     287                 :          0 :             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
     288                 :            :         }
     289                 :            : 
     290                 :          0 :         ::rtl::OUString ProfileAccess::getDefaultProfile( ::com::sun::star::mozilla::MozillaProductType product ) throw (::com::sun::star::uno::RuntimeException)
     291                 :            :         {
     292                 :          0 :             sal_Int32 index=product;
     293                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     294                 :          0 :             if (!m_Product.mCurrentProfileName.isEmpty())
     295                 :            :             {
     296                 :            :                 //default profile setted in mozilla registry
     297                 :          0 :                 return m_Product.mCurrentProfileName;
     298                 :            :             }
     299                 :          0 :             if (m_Product.mProfileList.empty())
     300                 :            :             {
     301                 :            :                 //there are not any profiles
     302                 :          0 :                 return ::rtl::OUString();
     303                 :            :             }
     304                 :          0 :             ProfileStruct * aProfile = (*m_Product.mProfileList.begin()).second;
     305                 :          0 :             return aProfile->getProfileName();
     306                 :            :         }
     307                 :            : #ifndef MINIMAL_PROFILEDISCOVER
     308                 :            :         nsresult ProfileAccess::isExistFileOrSymlink(nsILocalFile* aFile,PRBool *bExist)
     309                 :            :         {
     310                 :            :             nsresult rv;
     311                 :            :             nsAutoString path;
     312                 :            :             aFile->GetPath(path);
     313                 :            :             rv = aFile->Exists(bExist);
     314                 :            :             NS_ENSURE_SUCCESS(rv, rv);
     315                 :            :             if (!*bExist)
     316                 :            :             {
     317                 :            :                 rv = aFile->IsSymlink(bExist);
     318                 :            :                 NS_ENSURE_SUCCESS(rv, rv);
     319                 :            :             }
     320                 :            :             return rv;
     321                 :            :         }
     322                 :            :         nsresult ProfileAccess::isLockExist(nsILocalFile* aFile)
     323                 :            :         {
     324                 :            : #if defined (XP_MACOSX)
     325                 :            :             NS_NAMED_LITERAL_STRING(LOCKFILE_NAME, ".parentlock");
     326                 :            :             NS_NAMED_LITERAL_STRING(OLD_LOCKFILE_NAME, "parent.lock");
     327                 :            : #elif defined (XP_UNIX)
     328                 :            :             NS_ConvertASCIItoUTF16 OLD_LOCKFILE_NAME("lock");
     329                 :            :             NS_ConvertASCIItoUTF16 LOCKFILE_NAME(".parentlock");
     330                 :            : #else
     331                 :            :             NS_NAMED_LITERAL_STRING(OLD_LOCKFILE_NAME, "parent.lock");
     332                 :            :             NS_NAMED_LITERAL_STRING(LOCKFILE_NAME, "parent.lock");
     333                 :            : #endif
     334                 :            : 
     335                 :            :             nsresult rv;
     336                 :            : 
     337                 :            :             PRBool isDir;
     338                 :            :             rv = aFile->IsDirectory(&isDir);
     339                 :            :             NS_ENSURE_SUCCESS(rv, rv);
     340                 :            :             if (!isDir)
     341                 :            :                 return NS_ERROR_FILE_NOT_DIRECTORY;
     342                 :            : 
     343                 :            :             nsCOMPtr<nsILocalFile> lockFile;
     344                 :            :             rv = aFile->Clone((nsIFile **)((void **)getter_AddRefs(lockFile)));
     345                 :            :             NS_ENSURE_SUCCESS(rv, rv);
     346                 :            : 
     347                 :            :             rv = lockFile->Append(LOCKFILE_NAME);
     348                 :            :             NS_ENSURE_SUCCESS(rv, rv);
     349                 :            :             PRBool nExist=PR_FALSE;
     350                 :            :             rv = isExistFileOrSymlink(lockFile,&nExist);
     351                 :            :             NS_ENSURE_SUCCESS(rv, rv);
     352                 :            :             if (!nExist) // Check OLD_LOCKFILE_NAME
     353                 :            :             {
     354                 :            :                 nsCOMPtr<nsILocalFile> oldlockFile;
     355                 :            :                 rv = aFile->Clone((nsIFile **)((void **)getter_AddRefs(oldlockFile)));
     356                 :            :                 NS_ENSURE_SUCCESS(rv, rv);
     357                 :            : 
     358                 :            :                 rv = oldlockFile->Append(OLD_LOCKFILE_NAME);
     359                 :            :                 NS_ENSURE_SUCCESS(rv, rv);
     360                 :            :                 rv = isExistFileOrSymlink(oldlockFile,&nExist);
     361                 :            :                 NS_ENSURE_SUCCESS(rv, rv);
     362                 :            :             }
     363                 :            :             return nExist;
     364                 :            :         }
     365                 :            : 
     366                 :            : #endif
     367                 :          0 :         ::sal_Bool ProfileAccess::isProfileLocked( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
     368                 :            :         {
     369                 :            : #ifdef MINIMAL_PROFILEDISCOVER
     370                 :            :             (void)product; /* avoid warning about unused parameter */
     371                 :            :             (void)profileName; /* avoid warning about unused parameter */
     372                 :          0 :             return sal_True;
     373                 :            : #else
     374                 :            :             ::rtl::OUString path = getProfilePath(product,profileName);
     375                 :            :             if (path.isEmpty())
     376                 :            :                 return sal_True;
     377                 :            : 
     378                 :            :             // PRUnichar != sal_Unicode in mingw
     379                 :            :             nsAutoString filePath(reinterpret_cast_mingw_only<const PRUnichar *>(path.getStr()));
     380                 :            : 
     381                 :            :             nsresult rv;
     382                 :            :             nsCOMPtr<nsILocalFile>  localFile;
     383                 :            :             rv = NS_NewLocalFile(filePath, PR_TRUE,
     384                 :            :                                 getter_AddRefs(localFile));
     385                 :            :             NS_ENSURE_SUCCESS(rv,sal_True);
     386                 :            : 
     387                 :            :             PRBool exists = PR_FALSE;
     388                 :            :             rv = localFile->Exists(&exists);
     389                 :            :             NS_ENSURE_SUCCESS(rv, sal_True);
     390                 :            :             if (!exists)
     391                 :            :                 return sal_True;
     392                 :            : 
     393                 :            :             // If the profile is locked, we return true
     394                 :            :             rv = isLockExist(localFile);
     395                 :            :             if (rv)
     396                 :            :                 return sal_True;
     397                 :            :             return sal_False;
     398                 :            : #endif
     399                 :            :         }
     400                 :            : 
     401                 :          0 :         ::sal_Bool ProfileAccess::getProfileExists( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
     402                 :            :         {
     403                 :          0 :             sal_Int32 index=product;
     404                 :          0 :             ProductStruct &m_Product = m_ProductProfileList[index];
     405                 :          0 :             if (!m_Product.mProfileList.size() || m_Product.mProfileList.find(profileName) == m_Product.mProfileList.end())
     406                 :            :             {
     407                 :          0 :                 return sal_False;
     408                 :            :             }
     409                 :            :             else
     410                 :          0 :                 return sal_True;
     411                 :            :         }
     412                 :            :     }
     413                 :            : }
     414                 :            : 
     415                 :            : 
     416                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10