summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx')
-rw-r--r--connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx806
1 files changed, 806 insertions, 0 deletions
diff --git a/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx b/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx
new file mode 100644
index 000000000000..ae143d7c4d0f
--- /dev/null
+++ b/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx
@@ -0,0 +1,806 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+// Mozilla includes.
+#include <MNSInclude.hxx>
+
+#include "resource/mozab_res.hrc"
+#include "MDatabaseMetaDataHelper.hxx"
+#ifndef _CONNECTIVITY_MAB_CONVERSIONS_HXX_
+#include "MTypeConverter.hxx"
+#endif
+#ifndef CONNECTIVITY_MOZAB_MCONFIGACCESS_HXX
+#include "MConfigAccess.hxx"
+#endif
+#include <connectivity/dbexception.hxx>
+#include <comphelper/uno3.hxx>
+#include <comphelper/sequence.hxx>
+#include <osl/mutex.hxx>
+#include <osl/conditn.hxx>
+
+#include <nsIAbDirFactoryService.h>
+#include <MNSInit.hxx>
+#include <MNameMapper.hxx>
+#include "MNSMozabProxy.hxx"
+#include <MNSDeclares.hxx>
+
+static ::osl::Mutex m_aMetaMutex;
+
+#include <osl/diagnose.h>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/Property.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/sdb/ErrorCondition.hpp>
+#include <unotools/processfactory.hxx>
+#include <com/sun/star/mozilla/XMozillaBootstrap.hpp>
+
+
+#if OSL_DEBUG_LEVEL > 0
+# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr())
+#else /* OSL_DEBUG_LEVEL */
+# define OUtoCStr( x ) ("dummy")
+#endif /* OSL_DEBUG_LEVEL */
+
+
+static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
+static NS_DEFINE_CID(kAbDirFactoryServiceCID, NS_ABDIRFACTORYSERVICE_CID);
+static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID);
+
+using namespace connectivity::mozab;
+using namespace connectivity;
+using namespace ::com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbc;
+using namespace com::sun::star::mozilla;
+using namespace com::sun::star::sdb;
+
+namespace connectivity
+{
+ namespace mozab
+ {
+ static const char * const s_pADDRESSBOOKROOTDIR = "moz-abdirectory://";
+ }
+}
+
+extern sal_Bool MNS_Init(sal_Bool& aProfileExists);
+
+// -------------------------------------------------------------------------
+MDatabaseMetaDataHelper::MDatabaseMetaDataHelper()
+ :m_bProfileExists(sal_False)
+{
+ OSL_TRACE( "IN MDatabaseMetaDataHelper::MDatabaseMetaDataHelper()\n" );
+
+ OSL_TRACE( "\tOUT MDatabaseMetaDataHelper::MDatabaseMetaDataHelper()\n" );
+
+}
+// -------------------------------------------------------------------------
+MDatabaseMetaDataHelper::~MDatabaseMetaDataHelper()
+{
+ m_aTableNames.clear();
+ m_aTableTypes.clear();
+
+ if (m_bProfileExists)
+ {
+ Reference<XMozillaBootstrap> xMozillaBootstrap;
+ Reference<XMultiServiceFactory> xFactory = ::comphelper::getProcessServiceFactory();
+ OSL_ENSURE( xFactory.is(), "can't get service factory" );
+
+ Reference<XInterface> xInstance = xFactory->createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.mozilla.MozillaBootstrap")) );
+ OSL_ENSURE( xInstance.is(), "failed to create instance" );
+ xMozillaBootstrap = Reference<XMozillaBootstrap>(xInstance,UNO_QUERY);
+ m_bProfileExists = xMozillaBootstrap->shutdownProfile() > 0;
+ }
+
+ OSL_TRACE( "IN/OUT MDatabaseMetaDataHelper::~MDatabaseMetaDataHelper()\n" );
+}
+
+static nsresult enumSubs(nsISimpleEnumerator * subDirs,nsISupportsArray * array);
+//enum all sub folders
+static nsresult enumSubs(nsIAbDirectory * parentDir,nsISupportsArray * array)
+{
+ nsresult rv = NS_OK ;
+ nsCOMPtr<nsISimpleEnumerator> subDirectories;
+ rv = parentDir->GetChildNodes(getter_AddRefs(subDirectories));
+ if (NS_FAILED(rv)) { return rv; }
+
+ rv = enumSubs(subDirectories,array);
+ return rv;
+}
+
+#include <prmem.h> //need for PR_FREEIF
+static nsresult insertPABDescription()
+{
+ nsresult rv = NS_OK ;
+ // mozilla loads the descriptions of pab and history from a file named addressbook.properties
+ // we never deliver it with OOo,so mozab does not auot load personal addressbook and Collected addresses
+ // If we want to deliver addressbook.properties with OOo,we have to deal with hole mozilla chrome mechanism.
+ // So I insert the descriptiones as user prefes,they will cover the default value.
+
+ //"Personal Address Book" "Collected Addresses" are loaded from officecfg
+ nsCOMPtr<nsIPref> prefs = do_GetService(NS_PREF_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCAutoString pabPrefName(NS_LITERAL_CSTRING("ldap_2.servers.pab.description"));
+
+ sal_Bool bSetted=sal_False;
+ char *value = nsnull;
+ if (0 == prefs->CopyCharPref(pabPrefName.get(), &value))
+ {
+ if (!(value == nsnull || value[0] == 0))
+ {
+ bSetted = sal_True;
+ }
+ }
+ PR_FREEIF (value);
+ value=nsnull;
+ if (bSetted == sal_True)
+ {
+ const char* pPabDescription = static_cast< const char* >( getPabDescription( ) );
+ rv = prefs->SetCharPref (pabPrefName.get(), pPabDescription);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ nsCAutoString hisPrefName(NS_LITERAL_CSTRING("ldap_2.servers.history.description"));
+
+ bSetted=sal_False;
+ if (0 == prefs->CopyCharPref(hisPrefName.get(), &value))
+ {
+ if (!(value == nsnull || value[0] == 0))
+ {
+ bSetted = sal_True;
+ }
+ }
+ PR_FREEIF (value);
+ value=nsnull;
+ if (bSetted == sal_True)
+ {
+ const char* pHisDescription = static_cast< const char* >( getHisDescription( ) );
+
+ rv = prefs->SetCharPref (hisPrefName.get(), pHisDescription);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ return rv;
+}
+//
+// nsAbDirectoryDataSource
+//
+#define NS_RDF_CONTRACTID "@mozilla.org/rdf"
+#define NS_RDF_DATASOURCE_CONTRACTID NS_RDF_CONTRACTID "/datasource;1"
+#define NS_RDF_DATASOURCE_CONTRACTID_PREFIX NS_RDF_DATASOURCE_CONTRACTID "?name="
+#define NS_ABDIRECTORYDATASOURCE_CONTRACTID \
+ NS_RDF_DATASOURCE_CONTRACTID_PREFIX "addressdirectory"
+#define database_uri "@mozilla.org/rdf/datasource;1?name=addressdirectory"
+#define NS_ABDIRECTORYDATASOURCE_CID \
+{ /* 0A79186D-F754-11d2-A2DA-001083003D0C */ \
+ 0xa79186d, 0xf754, 0x11d2, \
+ {0xa2, 0xda, 0x0, 0x10, 0x83, 0x0, 0x3d, 0xc} \
+}
+
+// -------------------------------------------------------------------------
+// Case where we get a parent uri, and need to list its children.
+static nsresult getSubsFromParent(const rtl::OString& aParent, nsIEnumerator **aSubs)
+{
+
+ if (aSubs == nsnull) { return NS_ERROR_NULL_POINTER ; }
+ *aSubs = nsnull ;
+ nsresult retCode = NS_OK ;
+ nsCOMPtr<nsISupportsArray> array ;
+
+ NS_NewISupportsArray(getter_AddRefs(array)) ;
+
+ retCode = insertPABDescription();
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+
+ nsCOMPtr<nsIRDFService> rdfService(do_GetService(kRDFServiceCID, &retCode)) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsCOMPtr<nsIRDFResource> rdfResource ;
+
+ nsCOMPtr<nsIRDFDataSource> rdfDirectory ;
+
+ rtl::OString dir("rdf:addressdirectory");
+ retCode = rdfService->GetDataSource(dir.getStr(),getter_AddRefs(rdfDirectory)) ;
+
+
+
+ OSL_TRACE("uri: %s\n", aParent.getStr()) ;
+ retCode = rdfService->GetResource(nsDependentCString(aParent.getStr(),aParent.getLength()), getter_AddRefs(rdfResource)) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsCOMPtr<nsIAbDirectory> directory = do_QueryInterface(rdfResource, &retCode) ;
+ nsCOMPtr<nsISimpleEnumerator> tempEnum ;
+
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ retCode = directory->GetChildNodes(getter_AddRefs(tempEnum)) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+
+ PRBool hasMore = PR_TRUE ;
+ while (NS_SUCCEEDED(tempEnum->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsIAbDirectory> element ;
+ retCode = tempEnum->GetNext(getter_AddRefs(element)) ;
+ if (NS_SUCCEEDED(retCode))
+ {
+ array->AppendElement(element) ;
+ enumSubs(element,array);
+ }
+ }
+
+ array->Enumerate(aSubs) ;
+ return retCode ;
+}
+
+static nsresult enumSubs(nsISimpleEnumerator * subDirs,nsISupportsArray * array)
+{
+ PRBool hasMore = PR_TRUE ;
+ nsresult rv = NS_OK ;
+ while (NS_SUCCEEDED(subDirs->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsISupports> newDirSupports ;
+
+ rv = subDirs->GetNext(getter_AddRefs(newDirSupports)) ;
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<nsIAbDirectory> childDir = do_QueryInterface(newDirSupports, &rv) ;
+ NS_ENSURE_SUCCESS(rv, rv);
+ array->AppendElement(childDir);
+
+ rv = enumSubs(childDir,array);
+ }
+ return rv;
+}
+
+// Case where we get a factory uri and need to have it build the directories.
+static nsresult getSubsFromFactory(const rtl::OString& aFactory, nsIEnumerator **aSubs)
+{
+ if (aSubs == nsnull) { return NS_ERROR_NULL_POINTER ; }
+ *aSubs = nsnull ;
+ nsresult retCode = NS_OK ;
+
+ nsCOMPtr<nsIAbDirFactoryService> dirFactoryService = do_GetService(NS_ABDIRFACTORYSERVICE_CONTRACTID, &retCode);
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsCOMPtr<nsIAbDirFactory> dirFactory ;
+
+ retCode = dirFactoryService->GetDirFactory(aFactory.getStr(), getter_AddRefs(dirFactory)) ;
+ NS_ENSURE_SUCCESS (retCode, retCode) ;
+ nsCOMPtr <nsIAbDirectoryProperties> properties;
+ properties = do_CreateInstance(NS_ABDIRECTORYPROPERTIES_CONTRACTID, &retCode);
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+
+ retCode = properties->SetURI(aFactory.getStr());
+ NS_ENSURE_SUCCESS(retCode,retCode);
+
+ nsCOMPtr<nsISimpleEnumerator> subDirs ;
+ retCode = dirFactory->CreateDirectory(properties, getter_AddRefs(subDirs));
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsCOMPtr<nsISupportsArray> array ;
+
+ NS_NewISupportsArray(getter_AddRefs(array)) ;
+ retCode = enumSubs(subDirs,array);
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ array->Enumerate(aSubs) ;
+ return retCode ;
+}
+
+// Case where the uri itself is the directory we're looking for.
+static nsresult getSubsFromURI(const rtl::OString& aUri, nsIEnumerator **aSubs)
+{
+ if (aSubs == nsnull) { return NS_ERROR_NULL_POINTER ; }
+ *aSubs = nsnull ;
+ nsresult retCode = NS_OK ;
+
+ nsCOMPtr<nsIRDFService> rdfService(do_GetService(kRDFServiceCID, &retCode)) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsCOMPtr<nsIRDFResource> rdfResource ;
+
+ retCode = rdfService->GetResource(nsDependentCString(aUri.getStr(),aUri.getLength()), getter_AddRefs(rdfResource)) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ retCode = rdfService->UnregisterResource(rdfResource) ;
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+
+ nsCOMPtr<nsIAbDirectory> directory = do_QueryInterface(rdfResource, &retCode) ;
+
+ NS_ENSURE_SUCCESS(retCode, retCode) ;
+ nsAutoString nameAB ;
+
+ nameAB.AssignWithConversion("LDAP Directory") ;
+ directory->SetDirName(nameAB.get()) ;
+ nsCOMPtr<nsISupportsArray> array ;
+
+ NS_NewISupportsArray(getter_AddRefs(array)) ;
+ array->AppendElement(directory) ;
+ array->Enumerate(aSubs) ;
+ return retCode ;
+}
+
+namespace
+{
+ static void lcl_setNoAddressBookFoundError( ErrorDescriptor& _rError, OConnection& _rCon, MozillaProductType _eProductType,
+ sal_Bool bGivenURI )
+ {
+ sal_uInt16 nAddressBookNameRes = 0;
+ if ( !bGivenURI && _eProductType == MozillaProductType_Mozilla)
+ {
+ nAddressBookNameRes = STR_MOZILLA_ADDRESSBOOKS;
+ }
+ else
+ {
+ if ( _eProductType == MozillaProductType_Thunderbird )
+ {
+ nAddressBookNameRes = STR_THUNDERBIRD_ADDRESSBOOKS;
+ }
+ else
+ {
+ if ( _rCon.usesFactory() )
+ {
+ if ( _rCon.isOutlookExpress() )
+ {
+ nAddressBookNameRes = STR_OE_ADDRESSBOOK;
+ }
+ else
+ {
+ nAddressBookNameRes = STR_OUTLOOK_MAPI_ADDRESSBOOK;
+ }
+ }
+ else
+ {
+ OSL_ENSURE( !_rCon.isLDAP(), "lcl_setNoAddressBookFoundError: not to be called for LDAP connections!" );
+ nAddressBookNameRes = STR_MOZILLA_ADDRESSBOOKS;
+ }
+ }
+ }
+ _rError.set( 0, ErrorCondition::AB_ADDRESSBOOK_NOT_FOUND, _rCon.getResources().getResourceString( nAddressBookNameRes ) );
+ }
+}
+
+nsresult getTableStringsProxied(const sal_Char* sAbURI, sal_Int32 *nDirectoryType,MNameMapper *nmap,
+ ::std::vector< ::rtl::OUString >* _rStrings,
+ ::std::vector< ::rtl::OUString >* _rTypes,
+ sal_Int32* pErrorId )
+{
+ if (!sAbURI || !nmap || !_rStrings || !_rTypes || !pErrorId)
+ {
+ return NS_ERROR_NULL_POINTER;
+ }
+ OSL_TRACE("Using URI %s to getTables()\n",sAbURI );
+
+ // Get the mozilla addressbooks from the base directory.
+ nsresult rv = NS_OK;
+ nsCOMPtr<nsIEnumerator> subDirectories;
+
+ switch(*nDirectoryType)
+ {
+ case SDBCAddress::Mozilla:
+ rv = getSubsFromParent(sAbURI, getter_AddRefs(subDirectories)) ;
+ break;
+ case SDBCAddress::Outlook:
+ case SDBCAddress::OutlookExp:
+ rv = getSubsFromFactory(sAbURI, getter_AddRefs(subDirectories)) ;
+ break;
+ case SDBCAddress::LDAP:
+ rv = getSubsFromURI(sAbURI, getter_AddRefs(subDirectories)) ;
+ break;
+ default:
+ rv = getSubsFromParent(sAbURI, getter_AddRefs(subDirectories));
+ }
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // At this point we have a list containing the nsIAbDirectory we need to map as tables
+ rv = subDirectories -> First();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ PRUnichar *name = nsnull;
+ PRBool bIsMailList = PR_FALSE;
+
+ ::rtl::OUString aTableName;
+ nsCOMPtr<nsIRDFService> rdfService(do_GetService(kRDFServiceCID, &rv)) ;
+ NS_ENSURE_SUCCESS(rv, rv) ;
+
+ nmap->reset();
+ do {
+ nsCOMPtr<nsIAbDirectory> subDirectory;
+
+ nsCOMPtr<nsISupports> item;
+ rv = subDirectories -> CurrentItem(getter_AddRefs(item));
+ if ( NS_FAILED( rv ) )
+ {
+ *pErrorId = STR_COULD_NOT_RETRIEVE_AB_ENTRY;
+ return NS_ERROR_FAILURE;
+ }
+
+ subDirectory = do_QueryInterface(item, &rv);
+
+ subDirectory -> GetIsMailList(&bIsMailList);
+ // For now we're not interested in mailing lists.
+ rv = subDirectory -> GetDirName(&name);
+ if ( NS_FAILED( rv ) ) {
+ *pErrorId = STR_COULD_NOT_GET_DIRECTORY_NAME;
+ return NS_ERROR_FAILURE;
+ }
+ MTypeConverter::prUnicharToOUString(name, aTableName);
+ OSL_TRACE("TableName = >%s<\n", OUtoCStr( aTableName ) );
+
+ ODatabaseMetaDataResultSet::ORow aRow(3);
+
+ // Insert table into map
+ if ( aTableName.getLength() == 0 )
+ aTableName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AddressBook"));
+
+ OSL_TRACE("TableName = >%s<\n", OUtoCStr( aTableName ) );
+
+ rv = nmap->add( aTableName, subDirectory);
+ nsCOMPtr<nsIRDFResource> rdfResource = do_QueryInterface(subDirectory, &rv) ;
+ if (!NS_FAILED(rv))
+ rdfService->UnregisterResource(rdfResource);
+
+ if (!NS_FAILED(rv)) //failed means we have added this directory
+ {
+ //map mailing lists as views
+ _rStrings->push_back( aTableName ); // Table name
+ if (!bIsMailList) {
+ ::rtl::OUString aTableType(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TABLE")));
+ _rTypes->push_back( aTableType ); // Table type
+ }
+ else
+ {
+ ::rtl::OUString aTableType(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("VIEW")));
+ _rTypes->push_back( aTableType ); // Table type
+ }
+ }
+ rv = subDirectories -> Next();
+ } while ( rv == NS_OK);
+
+ return( NS_OK );
+}
+sal_Bool MDatabaseMetaDataHelper::getTableStrings( OConnection* _pCon,
+ ::std::vector< ::rtl::OUString >& _rStrings,
+ ::std::vector< ::rtl::OUString >& _rTypes)
+{
+ sal_Bool bGivenURI;
+ ::rtl::OUString sAbURI;
+ ::rtl::OString sAbURIString;
+
+ OSL_TRACE( "IN MDatabaseMetaDataHelper::getTableStrings( 0x%08X, %s)\n", _pCon, _pCon->getForceLoadTables()?"True":"False" );
+
+ ::osl::MutexGuard aGuard( m_aMetaMutex );
+ // Only do the query if we have to - performance degrades otherwise
+ if ( ! _pCon->getForceLoadTables() && m_aTableNames.size() > 0 ) {
+ _rStrings = m_aTableNames;
+ _rTypes = m_aTableTypes;
+ return( sal_True );
+ }
+
+ m_aTableNames.clear();
+ m_aTableTypes.clear();
+
+ sAbURI = _pCon->getMozURI();
+
+ OSL_TRACE("AbURI = %s\n", OUtoCStr( sAbURI ) );
+ if ( sAbURI.getLength() == 0 )
+ bGivenURI = sal_False;
+ else {
+ sAbURIString = ::rtl::OUStringToOString( sAbURI,
+ RTL_TEXTENCODING_ASCII_US);
+ bGivenURI = sal_True;
+ }
+
+ if ( bGivenURI )
+ OSL_TRACE("Using URI %s to getTables()\n", sAbURIString.getStr() );
+ else
+ OSL_TRACE("Using URI of ROOTDIR to getTables()\n");
+
+ // Get the mozilla addressbooks from the base directory.
+ nsresult rv = NS_OK;
+ nsCOMPtr<nsIEnumerator> subDirectories;
+ sal_Int32 nDirectoryType=0;
+ m_ProductType = MozillaProductType_Mozilla;
+ m_ProfileName = _pCon->getMozProfile();
+
+
+ if (_pCon->isThunderbird())
+ {
+ if (!bGivenURI)
+ sAbURIString = s_pADDRESSBOOKROOTDIR;
+ nDirectoryType = SDBCAddress::ThunderBird;
+ m_ProductType = MozillaProductType_Thunderbird;
+ }
+ else if (!bGivenURI)
+ {
+ sAbURIString = s_pADDRESSBOOKROOTDIR;
+ nDirectoryType = SDBCAddress::Mozilla;
+ }
+ else
+ {
+ if (_pCon->usesFactory())
+ {
+ nDirectoryType = SDBCAddress::Outlook;
+ }
+ else
+ {
+ if (_pCon->isLDAP())
+ {
+ nDirectoryType = SDBCAddress::LDAP;
+ }
+ else
+ {
+ sAbURIString = s_pADDRESSBOOKROOTDIR;
+ nDirectoryType = SDBCAddress::Mozilla;
+ }
+ }
+ }
+
+ if ( !_pCon->isLDAP() && !m_bProfileExists )
+ { // no need to boot up a Mozilla profile for an LDAP connection
+ Reference<XMozillaBootstrap> xMozillaBootstrap;
+ Reference<XMultiServiceFactory> xFactory = ::comphelper::getProcessServiceFactory();
+ OSL_ENSURE( xFactory.is(), "can't get service factory" );
+ Reference<XInterface> xInstance = xFactory->createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.mozilla.MozillaBootstrap")) );
+ OSL_ENSURE( xInstance.is(), "failed to create instance" );
+ xMozillaBootstrap = Reference<XMozillaBootstrap>(xInstance,UNO_QUERY);
+ m_bProfileExists = sal_False;
+ //If there are no profiles for this product
+ //Or the given profile name does not found
+ //We will reaise a "No Addressbook Directories Exist" error
+ if ( xMozillaBootstrap->getProfileCount(m_ProductType) == 0 ||
+ ( m_ProfileName.getLength() && !(xMozillaBootstrap->getProfilePath(m_ProductType,m_ProfileName).getLength())))
+ m_bProfileExists = sal_False;
+ else
+ if (xMozillaBootstrap->bootupProfile(m_ProductType,m_ProfileName) > 0)
+ m_bProfileExists = sal_True;
+
+ }
+ if ( !m_bProfileExists
+ && !_pCon->isLDAP()
+ && ( ( nDirectoryType == SDBCAddress::Mozilla )
+ || ( nDirectoryType == SDBCAddress::ThunderBird )
+ )
+ )
+ {
+ lcl_setNoAddressBookFoundError( m_aError, *_pCon, m_ProductType, bGivenURI );
+ return sal_False;
+ }
+
+ MNameMapper *nmap = _pCon->getNameMapper();
+ nmap->reset();
+
+ sal_Int32 nErrorResourceId( 0 );
+
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_GET_TABLE_STRINGS;
+ args.argCount = 6;
+ args.arg1 = (void*)sAbURIString.getStr();
+ args.arg2 = (void*)&nDirectoryType;
+ args.arg3 = (void*)nmap;
+ args.arg4 = (void*)&m_aTableNames;
+ args.arg5 = (void*)&m_aTableTypes;
+ args.arg6 = (void*)&nErrorResourceId;
+ rv = xMProxy.StartProxy(&args,m_ProductType,m_ProfileName);
+ m_aError.setResId( static_cast<sal_uInt16>(nErrorResourceId) );
+
+ if (NS_FAILED(rv))
+ {
+ if ( nErrorResourceId == 0 )
+ m_aError.setResId( STR_UNSPECIFIED_ERROR );
+ return sal_False;
+ }
+ OSL_TRACE( "\tOUT MDatabaseMetaDataHelper::getTableStrings()\n" );
+ _rStrings = m_aTableNames;
+ _rTypes = m_aTableTypes;
+
+ _pCon->setForceLoadTables(sal_False);
+ return( sal_True );
+}
+
+sal_Bool MDatabaseMetaDataHelper::getTables( OConnection* _pCon,
+ const ::rtl::OUString& tableNamePattern,
+ const Sequence< ::rtl::OUString >& types,
+ ODatabaseMetaDataResultSet::ORows& _rRows)
+{
+
+ static ODatabaseMetaDataResultSet::ORows aRows;
+
+ OSL_TRACE( "IN MDatabaseMetaDataHelper::getTables()\n" );
+ ::osl::MutexGuard aGuard( m_aMetaMutex );
+
+ ODatabaseMetaDataResultSet::ORows().swap(aRows); // this makes real clear where memory is freed as well
+ aRows.clear();
+
+ ::std::vector< ::rtl::OUString > tables;
+ ::std::vector< ::rtl::OUString > tabletypes;
+ ::rtl::OUString matchAny = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%"));;
+
+ if ( !getTableStrings( _pCon, tables,tabletypes ) )
+ return sal_False;
+
+ for ( size_t i = 0; i < tables.size(); i++ ) {
+ ODatabaseMetaDataResultSet::ORow aRow(3);
+
+ ::rtl::OUString aTableName = tables[i];
+ ::rtl::OUString aTableType = tabletypes[i];
+ OSL_TRACE("TableName = >%s<\n", OUtoCStr( aTableName ) );
+
+
+ // return tables to caller
+ if (match( tableNamePattern, aTableName, '\0' ) &&
+ ( 0 == types.getLength() || //types is null or types include aTableType or types include "%"
+ 0 != ::comphelper::findValue( types, aTableType, sal_True ).getLength() ||
+ 0 != ::comphelper::findValue( types, matchAny, sal_True ).getLength())) {
+ if ( aTableName.getLength() == 0 ) {
+ aTableName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AddressBook"));
+ }
+
+ OSL_TRACE( "TableName = %s ; TableType = %s\n", OUtoCStr(aTableName), OUtoCStr(aTableType) );
+
+ aRow.push_back( new ORowSetValueDecorator( aTableName ) ); // Table name
+ aRow.push_back( new ORowSetValueDecorator( aTableType ) ); // Table type
+ aRow.push_back( ODatabaseMetaDataResultSet::getEmptyValue() ); // Remarks
+ aRows.push_back(aRow);
+ }
+ }
+
+ OSL_TRACE( "\tOUT MDatabaseMetaDataHelper::getTables()\n" );
+ _rRows = aRows;
+ return(sal_True);
+}
+
+
+sal_Bool
+MDatabaseMetaDataHelper::testLDAPConnection( OConnection* _pCon )
+{
+ const sal_Unicode QUERY_CHAR = '?';
+ const sal_Char* MOZ_SCHEMA = "moz-abldapdirectory://";
+ const sal_Char* LDAP_SCHEMA = "ldap://";
+
+ rtl::OString sAbURI;
+ rtl::OUString sAbBindDN;
+ rtl::OUString sAbPassword;
+ sal_Bool useSSL = _pCon->getUseSSL();
+
+ nsresult rv(0);
+
+ sAbURI = OUStringToOString( _pCon->getMozURI(), RTL_TEXTENCODING_ASCII_US );
+ sAbBindDN = _pCon->getBindDN();
+ sAbPassword = _pCon->getPassword();
+
+
+ sal_Int32 pos = sAbURI.indexOf( MOZ_SCHEMA );
+ if ( pos != -1 ) {
+ sAbURI = sAbURI.replaceAt (pos, rtl_str_getLength( MOZ_SCHEMA ), ::rtl::OString(LDAP_SCHEMA) );
+ }
+
+ pos = sAbURI.indexOf( QUERY_CHAR );
+ if ( pos != -1 ) {
+ sal_Int32 len = sAbURI.getLength();
+ sAbURI = sAbURI.replaceAt( pos, len - pos, ::rtl::OString("") );
+ }
+ const sal_Unicode* bindDN=nsnull;
+ if (sAbBindDN.getLength() != 0)
+ {
+ bindDN = sAbBindDN.getStr();
+ }
+
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_TESTLDAP_INIT_LDAP;
+ args.argCount = 4;
+ args.arg1 = (void*)sAbURI.getStr();
+ args.arg2 = (void*)bindDN;
+ args.arg3 = (void*)sAbPassword.getStr();
+ args.arg4 = (void*)&useSSL;
+
+ MNSMozabProxy xMProxy;
+ rv = xMProxy.StartProxy( &args, m_ProductType, ::rtl::OUString() );
+ if ( NS_SUCCEEDED( rv ) ) //Init LDAP,pass OUString() to StarProxy to ignore profile switch
+ {
+ args.funcIndex = ProxiedFunc::FUNC_TESTLDAP_IS_LDAP_CONNECTED;
+ TimeValue timeValue = { 1, 0 }; // 1 * 30 Seconds timeout
+ sal_Int32 times=0;
+ while ( times++ < 30 )
+ {
+ rv = xMProxy.StartProxy( &args, m_ProductType, ::rtl::OUString() );
+ if ( NS_SUCCEEDED( rv ) )
+ // connected successfully
+ break;
+
+ if ( rv == (nsresult)PR_NOT_CONNECTED_ERROR )
+ // connection failed
+ break;
+
+ // not yet decided - continue waiting
+ osl_waitThread( &timeValue );
+ }
+ }
+ m_aError.setResId( STR_COULD_NOT_CONNECT_LDAP );
+ return NS_SUCCEEDED( rv ) ? sal_True : sal_False;
+}
+
+sal_Bool MDatabaseMetaDataHelper::NewAddressBook(OConnection* _pCon,const ::rtl::OUString & aTableName)
+{
+ sal_Bool bIsMozillaAB;
+
+ bIsMozillaAB = !_pCon->usesFactory() && ! _pCon->isLDAP();
+
+ if ( !bIsMozillaAB )
+ {
+ m_aError.setResId( STR_NO_TABLE_CREATION_SUPPORT );
+ return sal_False;
+ }
+ else
+ OSL_TRACE("Create table\n");
+
+ // Get the mozilla addressbooks from the base directory.
+ nsresult rv = NS_OK;
+
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_NEW_ADDRESS_BOOK;
+ args.argCount = 1;
+ args.arg1 = (void*)&aTableName;
+ rv = xMProxy.StartProxy(&args,m_ProductType,m_ProfileName);
+
+ _pCon->setForceLoadTables(sal_True); //force reload table next time
+ if (rv == NS_ERROR_FILE_IS_LOCKED)
+ {
+ m_aError.setResId( STR_MOZILLA_IS_RUNNING );
+ }
+ else if (NS_FAILED(rv))
+ {
+ m_aError.set( STR_COULD_NOT_CREATE_ADDRESSBOOK, 0, ::rtl::OUString::valueOf( sal_Int32(rv), 16 ) );
+ }
+ OSL_TRACE( "OUT MDatabaseMetaDataHelper::NewAddressBook()\n" );
+ return( NS_SUCCEEDED(rv) ? sal_True : sal_False );
+}
+nsresult NewAddressBook(const ::rtl::OUString * aName)
+{
+ if (isProfileLocked(NULL))
+ return NS_ERROR_FILE_IS_LOCKED;
+ nsresult rv;
+ nsCOMPtr<nsIAbDirectoryProperties> aProperties = do_CreateInstance(NS_ABDIRECTORYPROPERTIES_CONTRACTID, &rv);
+ NS_ENSURE_ARG_POINTER(aProperties);
+ const ::rtl::OUString& uName = *aName;
+ nsString nsName;
+ MTypeConverter::ouStringToNsString(uName,nsName);
+ aProperties->SetDescription(nsName);
+
+ nsCOMPtr<nsIRDFService> rdfService = do_GetService (kRDFServiceCID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsIRDFResource> parentResource;
+ rv = rdfService->GetResource(NS_LITERAL_CSTRING(kAllDirectoryRoot), getter_AddRefs(parentResource));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsIAbDirectory> parentDir = do_QueryInterface(parentResource, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = parentDir->CreateNewDirectory(aProperties);
+ return rv;
+}