19874e4f6SJuergen Schmidt /**************************************************************
29874e4f6SJuergen Schmidt  *
39874e4f6SJuergen Schmidt  * Licensed to the Apache Software Foundation (ASF) under one
49874e4f6SJuergen Schmidt  * or more contributor license agreements.  See the NOTICE file
59874e4f6SJuergen Schmidt  * distributed with this work for additional information
69874e4f6SJuergen Schmidt  * regarding copyright ownership.  The ASF licenses this file
79874e4f6SJuergen Schmidt  * to you under the Apache License, Version 2.0 (the
89874e4f6SJuergen Schmidt  * "License"); you may not use this file except in compliance
99874e4f6SJuergen Schmidt  * with the License.  You may obtain a copy of the License at
109874e4f6SJuergen Schmidt  *
119874e4f6SJuergen Schmidt  *   http://www.apache.org/licenses/LICENSE-2.0
129874e4f6SJuergen Schmidt  *
139874e4f6SJuergen Schmidt  * Unless required by applicable law or agreed to in writing,
149874e4f6SJuergen Schmidt  * software distributed under the License is distributed on an
159874e4f6SJuergen Schmidt  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169874e4f6SJuergen Schmidt  * KIND, either express or implied.  See the License for the
179874e4f6SJuergen Schmidt  * specific language governing permissions and limitations
189874e4f6SJuergen Schmidt  * under the License.
199874e4f6SJuergen Schmidt  *
209874e4f6SJuergen Schmidt  *************************************************************/
219874e4f6SJuergen Schmidt 
229874e4f6SJuergen Schmidt // MARKER(update_precomp.py): autogen include statement, do not remove
239874e4f6SJuergen Schmidt #include "precompiled_extensions.hxx"
249874e4f6SJuergen Schmidt #include "MNSProfileDiscover.hxx"
259874e4f6SJuergen Schmidt 
269874e4f6SJuergen Schmidt // Registry Keys
279874e4f6SJuergen Schmidt 
289874e4f6SJuergen Schmidt static ::rtl::OUString szProfileSubtreeString=::rtl::OUString::createFromAscii("Profiles");
299874e4f6SJuergen Schmidt static ::rtl::OUString szCurrentProfileString= ::rtl::OUString::createFromAscii("CurrentProfile");
309874e4f6SJuergen Schmidt static ::rtl::OUString szDirectoryString =::rtl::OUString::createFromAscii("directory");
319874e4f6SJuergen Schmidt 
329874e4f6SJuergen Schmidt #ifndef MAXPATHLEN
339874e4f6SJuergen Schmidt #define MAXPATHLEN 1024
349874e4f6SJuergen Schmidt #endif
359874e4f6SJuergen Schmidt #include <MNSFolders.hxx>
369874e4f6SJuergen Schmidt #include <MNSINIParser.hxx>
379874e4f6SJuergen Schmidt 
389874e4f6SJuergen Schmidt namespace connectivity
399874e4f6SJuergen Schmidt {
409874e4f6SJuergen Schmidt     namespace mozab
419874e4f6SJuergen Schmidt     {
ProfileStruct(MozillaProductType aProduct,::rtl::OUString aProfileName,const::rtl::OUString & aProfilePath)429874e4f6SJuergen Schmidt         ProfileStruct::ProfileStruct(MozillaProductType aProduct,::rtl::OUString aProfileName,
439874e4f6SJuergen Schmidt             const ::rtl::OUString& aProfilePath)
449874e4f6SJuergen Schmidt         {
459874e4f6SJuergen Schmidt             product=aProduct;
469874e4f6SJuergen Schmidt             profileName = aProfileName;
479874e4f6SJuergen Schmidt             profilePath = aProfilePath;
489874e4f6SJuergen Schmidt         }
getProfilePath()499874e4f6SJuergen Schmidt         ::rtl::OUString ProfileStruct::getProfilePath()
509874e4f6SJuergen Schmidt         {
519874e4f6SJuergen Schmidt             return profilePath;
529874e4f6SJuergen Schmidt         }
539874e4f6SJuergen Schmidt 
~ProfileAccess()549874e4f6SJuergen Schmidt         ProfileAccess::~ProfileAccess()
559874e4f6SJuergen Schmidt         {
569874e4f6SJuergen Schmidt         }
ProfileAccess()579874e4f6SJuergen Schmidt         ProfileAccess::ProfileAccess()
589874e4f6SJuergen Schmidt         {
599874e4f6SJuergen Schmidt             LoadProductsInfo();
609874e4f6SJuergen Schmidt         }
619874e4f6SJuergen Schmidt 
LoadProductsInfo()629874e4f6SJuergen Schmidt         sal_Int32 ProfileAccess::LoadProductsInfo()
639874e4f6SJuergen Schmidt         {
649874e4f6SJuergen Schmidt             //load SeaMonkey 2 profiles to m_ProductProfileList
659874e4f6SJuergen Schmidt             sal_Int32 count = LoadXPToolkitProfiles(MozillaProductType_Mozilla);
669874e4f6SJuergen Schmidt 
679874e4f6SJuergen Schmidt             //load thunderbird profiles to m_ProductProfileList
689874e4f6SJuergen Schmidt             count += LoadXPToolkitProfiles(MozillaProductType_Thunderbird);
699874e4f6SJuergen Schmidt 
709874e4f6SJuergen Schmidt             //load firefox profiles to m_ProductProfileList
719874e4f6SJuergen Schmidt             //firefox profile does not containt address book, but maybe others need them
729874e4f6SJuergen Schmidt             count += LoadXPToolkitProfiles(MozillaProductType_Firefox);
739874e4f6SJuergen Schmidt             return count;
749874e4f6SJuergen Schmidt         }
759874e4f6SJuergen Schmidt         //Thunderbird and firefox profiles are saved in profiles.ini
LoadXPToolkitProfiles(MozillaProductType product)769874e4f6SJuergen Schmidt         sal_Int32 ProfileAccess::LoadXPToolkitProfiles(MozillaProductType product)
779874e4f6SJuergen Schmidt         {
789874e4f6SJuergen Schmidt             sal_Int32 index=product;
799874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
809874e4f6SJuergen Schmidt 
819874e4f6SJuergen Schmidt             ::rtl::OUString regDir = getRegistryDir(product);
829874e4f6SJuergen Schmidt             ::rtl::OUString profilesIni( regDir );
839874e4f6SJuergen Schmidt             profilesIni += ::rtl::OUString::createFromAscii( "profiles.ini" );
849874e4f6SJuergen Schmidt             IniParser parser( profilesIni );
859874e4f6SJuergen Schmidt             IniSectionMap &mAllSection = *(parser.getAllSection());
869874e4f6SJuergen Schmidt 
879874e4f6SJuergen Schmidt             IniSectionMap::iterator iBegin = mAllSection.begin();
889874e4f6SJuergen Schmidt             IniSectionMap::iterator iEnd = mAllSection.end();
899874e4f6SJuergen Schmidt             for(;iBegin != iEnd;iBegin++)
909874e4f6SJuergen Schmidt             {
919874e4f6SJuergen Schmidt                 ini_Section *aSection = &(*iBegin).second;
929874e4f6SJuergen Schmidt                 ::rtl::OUString profileName;
939874e4f6SJuergen Schmidt                 ::rtl::OUString profilePath;
949874e4f6SJuergen Schmidt                 ::rtl::OUString sIsRelative;
959874e4f6SJuergen Schmidt                 ::rtl::OUString sIsDefault;
969874e4f6SJuergen Schmidt 
979874e4f6SJuergen Schmidt                 for(NameValueList::iterator itor=aSection->lList.begin();
989874e4f6SJuergen Schmidt                     itor != aSection->lList.end();
999874e4f6SJuergen Schmidt                     itor++)
1009874e4f6SJuergen Schmidt                 {
1019874e4f6SJuergen Schmidt                         struct ini_NameValue * aValue = &(*itor);
1029874e4f6SJuergen Schmidt                         if (aValue->sName.equals(::rtl::OUString::createFromAscii("Name")))
1039874e4f6SJuergen Schmidt                         {
1049874e4f6SJuergen Schmidt                             profileName = aValue->sValue;
1059874e4f6SJuergen Schmidt                         }
1069874e4f6SJuergen Schmidt                         else if (aValue->sName.equals(::rtl::OUString::createFromAscii("IsRelative")))
1079874e4f6SJuergen Schmidt                         {
1089874e4f6SJuergen Schmidt                             sIsRelative = aValue->sValue;
1099874e4f6SJuergen Schmidt                         }
1109874e4f6SJuergen Schmidt                         else if (aValue->sName.equals(::rtl::OUString::createFromAscii("Path")))
1119874e4f6SJuergen Schmidt                         {
1129874e4f6SJuergen Schmidt                             profilePath = aValue->sValue;
1139874e4f6SJuergen Schmidt                         }
1149874e4f6SJuergen Schmidt                         else if (aValue->sName.equals(::rtl::OUString::createFromAscii("Default")))
1159874e4f6SJuergen Schmidt                         {
1169874e4f6SJuergen Schmidt                             sIsDefault = aValue->sValue;
1179874e4f6SJuergen Schmidt                         }
1189874e4f6SJuergen Schmidt                 }
1199874e4f6SJuergen Schmidt                 if (profileName.getLength() != 0 || profilePath.getLength() != 0)
1209874e4f6SJuergen Schmidt                 {
1219874e4f6SJuergen Schmidt                     sal_Int32 isRelative = 0;
1229874e4f6SJuergen Schmidt                     if (sIsRelative.getLength() != 0)
1239874e4f6SJuergen Schmidt                     {
1249874e4f6SJuergen Schmidt                         isRelative = sIsRelative.toInt32();
1259874e4f6SJuergen Schmidt                     }
126*f27fad25SDamjan Jovanovic                     if (isRelative)
127*f27fad25SDamjan Jovanovic                     {
128*f27fad25SDamjan Jovanovic                         // Make it absolute
129*f27fad25SDamjan Jovanovic                         profilePath = regDir + profilePath;
130*f27fad25SDamjan Jovanovic                     }
1319874e4f6SJuergen Schmidt 
1329874e4f6SJuergen Schmidt                     ProfileStruct*  profileItem     = new ProfileStruct(product,profileName,
133*f27fad25SDamjan Jovanovic                             profilePath);
1349874e4f6SJuergen Schmidt                     m_Product.mProfileList[profileName] = profileItem;
1359874e4f6SJuergen Schmidt 
1369874e4f6SJuergen Schmidt                     sal_Int32 isDefault = 0;
1379874e4f6SJuergen Schmidt                     if (sIsDefault.getLength() != 0)
1389874e4f6SJuergen Schmidt                     {
1399874e4f6SJuergen Schmidt                         isDefault = sIsDefault.toInt32();
1409874e4f6SJuergen Schmidt                     }
1419874e4f6SJuergen Schmidt                     if (isDefault)
1429874e4f6SJuergen Schmidt                         m_Product.mCurrentProfileName = profileName;
1439874e4f6SJuergen Schmidt 
1449874e4f6SJuergen Schmidt                 }
1459874e4f6SJuergen Schmidt 
1469874e4f6SJuergen Schmidt             }
1479874e4f6SJuergen Schmidt             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
1489874e4f6SJuergen Schmidt         }
1499874e4f6SJuergen Schmidt 
getProfilePath(::com::sun::star::mozilla::MozillaProductType product,const::rtl::OUString & profileName)1509874e4f6SJuergen Schmidt         ::rtl::OUString ProfileAccess::getProfilePath( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
1519874e4f6SJuergen Schmidt         {
1529874e4f6SJuergen Schmidt             sal_Int32 index=product;
1539874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
1549874e4f6SJuergen Schmidt             if (!m_Product.mProfileList.size() || m_Product.mProfileList.find(profileName) == m_Product.mProfileList.end())
1559874e4f6SJuergen Schmidt             {
1569874e4f6SJuergen Schmidt                 //Profile not found
1579874e4f6SJuergen Schmidt                 return ::rtl::OUString();
1589874e4f6SJuergen Schmidt             }
1599874e4f6SJuergen Schmidt             else
1609874e4f6SJuergen Schmidt                 return m_Product.mProfileList[profileName]->getProfilePath();
1619874e4f6SJuergen Schmidt         }
1629874e4f6SJuergen Schmidt 
getProfileCount(::com::sun::star::mozilla::MozillaProductType product)1639874e4f6SJuergen Schmidt         ::sal_Int32 ProfileAccess::getProfileCount( ::com::sun::star::mozilla::MozillaProductType product) throw (::com::sun::star::uno::RuntimeException)
1649874e4f6SJuergen Schmidt         {
1659874e4f6SJuergen Schmidt             sal_Int32 index=product;
1669874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
1679874e4f6SJuergen Schmidt             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
1689874e4f6SJuergen Schmidt         }
getProfileList(::com::sun::star::mozilla::MozillaProductType product,::com::sun::star::uno::Sequence<::rtl::OUString> & list)1699874e4f6SJuergen Schmidt         ::sal_Int32 ProfileAccess::getProfileList( ::com::sun::star::mozilla::MozillaProductType product, ::com::sun::star::uno::Sequence< ::rtl::OUString >& list ) throw (::com::sun::star::uno::RuntimeException)
1709874e4f6SJuergen Schmidt         {
1719874e4f6SJuergen Schmidt             sal_Int32 index=product;
1729874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
1739874e4f6SJuergen Schmidt             list.realloc(static_cast<sal_Int32>(m_Product.mProfileList.size()));
1749874e4f6SJuergen Schmidt             sal_Int32 i=0;
1759874e4f6SJuergen Schmidt             for(ProfileList::iterator itor=m_Product.mProfileList.begin();
1769874e4f6SJuergen Schmidt                 itor != m_Product.mProfileList.end();
1779874e4f6SJuergen Schmidt                 itor++)
1789874e4f6SJuergen Schmidt             {
1799874e4f6SJuergen Schmidt                 ProfileStruct * aProfile = (*itor).second;
1809874e4f6SJuergen Schmidt                 list[i] = aProfile->getProfileName();
1819874e4f6SJuergen Schmidt                 i++;
1829874e4f6SJuergen Schmidt             }
1839874e4f6SJuergen Schmidt 
1849874e4f6SJuergen Schmidt             return static_cast< ::sal_Int32 >(m_Product.mProfileList.size());
1859874e4f6SJuergen Schmidt         }
1869874e4f6SJuergen Schmidt 
getDefaultProfile(::com::sun::star::mozilla::MozillaProductType product)1879874e4f6SJuergen Schmidt         ::rtl::OUString ProfileAccess::getDefaultProfile( ::com::sun::star::mozilla::MozillaProductType product ) throw (::com::sun::star::uno::RuntimeException)
1889874e4f6SJuergen Schmidt         {
1899874e4f6SJuergen Schmidt             sal_Int32 index=product;
1909874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
1919874e4f6SJuergen Schmidt             if (m_Product.mCurrentProfileName.getLength() != 0)
1929874e4f6SJuergen Schmidt             {
1939874e4f6SJuergen Schmidt                 //default profile setted in mozilla registry
1949874e4f6SJuergen Schmidt                 return m_Product.mCurrentProfileName;
1959874e4f6SJuergen Schmidt             }
1969874e4f6SJuergen Schmidt             if (m_Product.mProfileList.size() == 0)
1979874e4f6SJuergen Schmidt             {
1989874e4f6SJuergen Schmidt                 //there are not any profiles
1999874e4f6SJuergen Schmidt                 return ::rtl::OUString();
2009874e4f6SJuergen Schmidt             }
2019874e4f6SJuergen Schmidt             ProfileStruct * aProfile = (*m_Product.mProfileList.begin()).second;
2029874e4f6SJuergen Schmidt             return aProfile->getProfileName();
2039874e4f6SJuergen Schmidt         }
2049874e4f6SJuergen Schmidt 
isProfileLocked(::com::sun::star::mozilla::MozillaProductType product,const::rtl::OUString & profileName)2059874e4f6SJuergen Schmidt         ::sal_Bool ProfileAccess::isProfileLocked( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
2069874e4f6SJuergen Schmidt         {
2079874e4f6SJuergen Schmidt             (void)product; /* avoid warning about unused parameter */
2089874e4f6SJuergen Schmidt             (void)profileName; /* avoid warning about unused parameter */
2099874e4f6SJuergen Schmidt             return sal_True;
2109874e4f6SJuergen Schmidt         }
2119874e4f6SJuergen Schmidt 
getProfileExists(::com::sun::star::mozilla::MozillaProductType product,const::rtl::OUString & profileName)2129874e4f6SJuergen Schmidt         ::sal_Bool ProfileAccess::getProfileExists( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException)
2139874e4f6SJuergen Schmidt         {
2149874e4f6SJuergen Schmidt             sal_Int32 index=product;
2159874e4f6SJuergen Schmidt             ProductStruct &m_Product = m_ProductProfileList[index];
2169874e4f6SJuergen Schmidt             if (!m_Product.mProfileList.size() || m_Product.mProfileList.find(profileName) == m_Product.mProfileList.end())
2179874e4f6SJuergen Schmidt             {
2189874e4f6SJuergen Schmidt                 return sal_False;
2199874e4f6SJuergen Schmidt             }
2209874e4f6SJuergen Schmidt             else
2219874e4f6SJuergen Schmidt                 return sal_True;
2229874e4f6SJuergen Schmidt         }
2239874e4f6SJuergen Schmidt     }
2249874e4f6SJuergen Schmidt }
2259874e4f6SJuergen Schmidt 
2269874e4f6SJuergen Schmidt 
227