| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_connectivity.hxx" |
| |
| #ifndef CONNECTIVITY_MOZAB_MCONFIGACCESS_HXX |
| #include "MConfigAccess.hxx" |
| #endif |
| #ifndef CONNECTIVITY_MOZAB_MEXTCONFIGACCESS_HXX |
| #include "MExtConfigAccess.hxx" |
| #endif |
| #include "MConnection.hxx" |
| |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::beans; |
| |
| //......................................................................... |
| namespace connectivity |
| { |
| namespace mozab |
| { |
| //----------------------------------------------------------------- |
| Reference< XPropertySet > createDriverConfigNode( Reference< XMultiServiceFactory > _rxORB ) |
| { |
| Reference< XPropertySet > xNode; |
| try |
| { |
| //============================================================= |
| // create the config provider |
| Reference< XMultiServiceFactory > xConfigProvider( |
| _rxORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider" )) ), |
| UNO_QUERY |
| ); |
| OSL_ENSURE( xConfigProvider.is(), "createDriverConfigNode: could not create the config provider!" ); |
| |
| if ( xConfigProvider.is() ) |
| { |
| ::rtl::OUString sCompleteNodePath = ::rtl::OUString::createFromAscii ("/org.openoffice.Office.DataAccess/DriverSettings/" ); |
| sCompleteNodePath += OConnection::getDriverImplementationName(); |
| |
| //========================================================= |
| // arguments for creating the config access |
| Sequence< Any > aArguments(2); |
| // the path to the node to open |
| aArguments[0] <<= PropertyValue( |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("nodepath")), |
| 0, |
| makeAny( sCompleteNodePath ), |
| PropertyState_DIRECT_VALUE |
| ); |
| // the depth: -1 means unlimited |
| aArguments[1] <<= PropertyValue( |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("depth")), |
| 0, |
| makeAny( (sal_Int32)-1 ), |
| PropertyState_DIRECT_VALUE |
| ); |
| |
| //========================================================= |
| // create the access |
| Reference< XInterface > xAccess = xConfigProvider->createInstanceWithArguments( |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess" )), |
| aArguments |
| ); |
| OSL_ENSURE( xAccess.is(), "createDriverConfigNode: invalid access returned (should throw an exception instead)!" ); |
| |
| xNode = xNode.query( xAccess ); |
| } |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "createDriverConfigNode: caught an exception while accessing the driver's config node!" ); |
| } |
| |
| // outta here |
| return xNode; |
| } |
| |
| //----------------------------------------------------------------- |
| namespace |
| { |
| // a private helper to accessing the point where we store the reference |
| // to the factory |
| Reference< XMultiServiceFactory >& accessFactoryStorage( ) |
| { |
| static Reference< XMultiServiceFactory > xMozabServiceFactory; |
| return xMozabServiceFactory; |
| } |
| } |
| |
| //----------------------------------------------------------------- |
| void setMozabServiceFactory( const Reference< XMultiServiceFactory >& _rxFactory ) |
| { |
| accessFactoryStorage( ) = _rxFactory; |
| } |
| |
| //----------------------------------------------------------------- |
| const Reference< XMultiServiceFactory >& getMozabServiceFactory( ) |
| { |
| return accessFactoryStorage( ); |
| } |
| |
| //----------------------------------------------------------------- |
| ::rtl::OUString getDescription(const sal_Char* sNode,const ::rtl::OUString & sDefault) |
| { |
| ::rtl::OUString sPreferredName; |
| ::rtl::OUString sDescription; |
| |
| Reference< XMultiServiceFactory > xFactory = getMozabServiceFactory(); |
| OSL_ENSURE( xFactory.is(), "getPreferredProfileName: invalid service factory!" ); |
| if ( xFactory.is() ) |
| { |
| try |
| { |
| Reference< XPropertySet > xDriverNode = createDriverConfigNode( xFactory ); |
| Reference< XPropertySet > xMozPrefsNode; |
| if ( xDriverNode.is() ) |
| xDriverNode->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("MozillaPreferences" )) ) >>= xMozPrefsNode; |
| OSL_ENSURE( xMozPrefsNode.is(), "getPreferredProfileName: could not access the node for the mozilla preferences!" ); |
| if ( xMozPrefsNode.is() ) |
| xMozPrefsNode->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ProfileName" )) ) >>= sPreferredName; |
| if ( xMozPrefsNode.is() ) |
| xMozPrefsNode->getPropertyValue( ::rtl::OUString::createFromAscii(sNode) ) >>= sDescription; |
| if (sDescription.getLength() == 0) |
| sDescription = sDefault; |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "getDescription: caught an exception!" ); |
| } |
| } |
| if (sDescription.getLength() == 0) |
| sDescription = sDefault; |
| return sDescription; |
| } |
| //----------------------------------------------------------------- |
| ::rtl::OUString getPreferredProfileName( ) |
| { |
| ::rtl::OUString sPreferredName; |
| |
| Reference< XMultiServiceFactory > xFactory = getMozabServiceFactory(); |
| OSL_ENSURE( xFactory.is(), "getPreferredProfileName: invalid service factory!" ); |
| if ( xFactory.is() ) |
| { |
| try |
| { |
| Reference< XPropertySet > xDriverNode = createDriverConfigNode( xFactory ); |
| Reference< XPropertySet > xMozPrefsNode; |
| if ( xDriverNode.is() ) |
| xDriverNode->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("MozillaPreferences" )) ) >>= xMozPrefsNode; |
| OSL_ENSURE( xMozPrefsNode.is(), "getPreferredProfileName: could not access the node for the mozilla preferences!" ); |
| if ( xMozPrefsNode.is() ) |
| xMozPrefsNode->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ProfileName" )) ) >>= sPreferredName; |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "getPreferredProfileName: caught an exception!" ); |
| } |
| } |
| return sPreferredName; |
| } |
| } |
| } |
| |
| //......................................................................... |
| |
| //------------------------------------------------------------------------- |
| extern "C" const sal_Unicode* SAL_CALL getUserProfile( void ) |
| { |
| static sal_Bool bReadConfig = sal_False; |
| static ::rtl::OUString sUserProfile; |
| if ( !bReadConfig ) |
| { |
| sUserProfile = ::connectivity::mozab::getPreferredProfileName( ); |
| bReadConfig = sal_True; |
| } |
| |
| return sUserProfile.getStr(); |
| } |
| //------------------------------------------------------------------------ |
| extern "C" const sal_Char* SAL_CALL getPabDescription( void ) |
| { |
| static sal_Bool bReadConfig = sal_False; |
| static ::rtl::OUString usPabDescription; |
| static ::rtl::OString sPabDescription; |
| |
| if ( !bReadConfig ) |
| { |
| usPabDescription = ::connectivity::mozab::getDescription( |
| "PabDescription" , |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Personal Address Book" ))); |
| sPabDescription = ::rtl::OUStringToOString( usPabDescription, |
| RTL_TEXTENCODING_UTF8); |
| bReadConfig = sal_True; |
| } |
| |
| return sPabDescription.getStr(); |
| } |
| |
| //------------------------------------------------------------------------- |
| extern "C" const sal_Char* SAL_CALL getHisDescription( void ) |
| { |
| static sal_Bool bReadConfig = sal_False; |
| static ::rtl::OUString usHisDescription; |
| static ::rtl::OString sHisDescription; |
| |
| if ( !bReadConfig ) |
| { |
| usHisDescription = ::connectivity::mozab::getDescription( |
| "HisDescription" , |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Collected Addresses" ))); |
| sHisDescription = ::rtl::OUStringToOString( usHisDescription, |
| RTL_TEXTENCODING_UTF8); |
| bReadConfig = sal_True; |
| } |
| |
| return sHisDescription.getStr(); |
| } |
| |
| //------------------------------------------------------------------------- |
| // MConfigAccess was invented to allow non-UNO parts access to the configuration. |
| // Unfortunately, configuration access requires a XMultiServiceFactory - which the |
| // mozilla side does not have. |
| // So we create a "library-local" service factory here: Every need for a service |
| // factory can be fullfilled by this factory (similar to the get/setProcessServiceFactory |
| // in comphelper). |
| // This is halfway valid, as usually, the mozabdrv library is invoked from the mozab library |
| // only. The latter contains the driver class (and only this class and nothing more), and |
| // the driver class is a singleton. The driver itself is created with a service factory, |
| // which (by definition) can and should be used for all subsequent service requests. |
| // And this is exactly what we're allowing with the following functions .... |
| |
| /** _pFactory must point to an XMultiServiceFactory, which must be aquired once |
| for purpose of safely transfering it. The callee will release this interface |
| when it has stored the pointer somewhere else. |
| */ |
| extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL setMozabServiceFactory( |
| void* _pFactory ) |
| { |
| Reference< XMultiServiceFactory > xFactory = static_cast< XMultiServiceFactory* >( _pFactory ); |
| ::connectivity::mozab::setMozabServiceFactory( xFactory ); |
| |
| // by definition, the object behind the interface pointer has been acquired once for purpose |
| // of safely transporting it |
| xFactory->release(); |
| } |
| |