summaryrefslogtreecommitdiff
path: root/ucbhelper/source/client/contentbroker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucbhelper/source/client/contentbroker.cxx')
-rw-r--r--ucbhelper/source/client/contentbroker.cxx379
1 files changed, 379 insertions, 0 deletions
diff --git a/ucbhelper/source/client/contentbroker.cxx b/ucbhelper/source/client/contentbroker.cxx
new file mode 100644
index 000000000000..43d1491d8507
--- /dev/null
+++ b/ucbhelper/source/client/contentbroker.cxx
@@ -0,0 +1,379 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: contentbroker.cxx,v $
+ * $Revision: 1.10 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/ucb/XContentIdentifierFactory.hpp>
+#include <com/sun/star/ucb/XContentProvider.hpp>
+#include <com/sun/star/ucb/XContentProviderManager.hpp>
+#include <com/sun/star/ucb/XCommandProcessor.hpp>
+#include <ucbhelper/contentbroker.hxx>
+
+using namespace com::sun::star::lang;
+using namespace com::sun::star::ucb;
+using namespace com::sun::star::uno;
+using namespace rtl;
+
+namespace
+{
+ osl::Mutex globalContentBrokerMutex;
+ osl::Mutex & getGlobalContentBrokerMutex() { return globalContentBrokerMutex; }
+
+} // namespace
+
+namespace ucbhelper
+{
+
+//=========================================================================
+//=========================================================================
+//
+// class ContentBroker_Impl.
+//
+//=========================================================================
+//=========================================================================
+
+class ContentBroker_Impl
+{
+ Reference< XMultiServiceFactory > m_xSMgr;
+ Reference< XContentIdentifierFactory > m_xIdFac;
+ Reference< XContentProvider > m_xProvider;
+ Reference< XContentProviderManager > m_xProviderMgr;
+ Reference< XCommandProcessor > m_xCommandProc;
+ osl::Mutex m_aMutex;
+ Sequence< Any > m_aArguments;
+ ContentProviderDataList m_aProvData;
+ bool m_bInitDone;
+
+public:
+ ContentBroker_Impl( const Reference< XMultiServiceFactory >& rSMgr,
+ const Sequence< Any >& rArguments )
+ : m_xSMgr( rSMgr ), m_aArguments( rArguments ), m_bInitDone( sal_False )
+ {}
+
+ ContentBroker_Impl( const Reference< XMultiServiceFactory >& rSMgr,
+ const ContentProviderDataList & rData )
+ : m_xSMgr( rSMgr ), m_aProvData( rData ), m_bInitDone( sal_False )
+ {}
+
+ ~ContentBroker_Impl();
+
+ bool initialize();
+
+ const Reference< XMultiServiceFactory >& getServiceManager() const
+ { return m_xSMgr; }
+
+ const Reference< XContentIdentifierFactory >& getIdFactory() const
+ { return m_xIdFac; }
+
+ const Reference< XContentProvider >& getProvider() const
+ { return m_xProvider; }
+
+ const Reference< XContentProviderManager >& getProviderManager() const
+ { return m_xProviderMgr; }
+
+ const Reference< XCommandProcessor >& getCommandProcessor() const
+ { return m_xCommandProc; }
+};
+
+//=========================================================================
+//=========================================================================
+//
+// ContentBroker Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+// static member!
+ContentBroker* ContentBroker::m_pTheBroker = 0;
+
+//=========================================================================
+ContentBroker::ContentBroker( const Reference< XMultiServiceFactory >& rSMgr,
+ const Sequence< Any >& rArguments )
+{
+ m_pImpl = new ContentBroker_Impl( rSMgr, rArguments );
+}
+
+//=========================================================================
+ContentBroker::ContentBroker( const Reference< XMultiServiceFactory >& rSMgr,
+ const ContentProviderDataList & rData )
+{
+ m_pImpl = new ContentBroker_Impl( rSMgr, rData );
+}
+
+//=========================================================================
+ContentBroker::~ContentBroker()
+{
+ delete m_pImpl;
+}
+
+//=========================================================================
+Reference< XMultiServiceFactory > ContentBroker::getServiceManager() const
+{
+ return m_pImpl->getServiceManager();
+}
+
+//=========================================================================
+Reference< XContentIdentifierFactory >
+ ContentBroker::getContentIdentifierFactoryInterface() const
+{
+ return m_pImpl->getIdFactory();
+}
+
+//=========================================================================
+Reference< XContentProvider >
+ ContentBroker::getContentProviderInterface() const
+{
+ return m_pImpl->getProvider();
+}
+
+//=========================================================================
+Reference< XContentProviderManager >
+ ContentBroker::getContentProviderManagerInterface() const
+{
+ return m_pImpl->getProviderManager();
+}
+
+//=========================================================================
+Reference< XCommandProcessor >
+ ContentBroker::getCommandProcessorInterface() const
+{
+ return m_pImpl->getCommandProcessor();
+}
+
+//=========================================================================
+// static
+sal_Bool ContentBroker::initialize(
+ const Reference< XMultiServiceFactory >& rSMgr,
+ const Sequence< Any >& rArguments )
+{
+ OSL_ENSURE( !m_pTheBroker,
+ "ContentBroker::initialize - already initialized!" );
+
+ if ( !m_pTheBroker )
+ {
+ osl::Guard< osl::Mutex > aGuard( getGlobalContentBrokerMutex() );
+
+ if ( !m_pTheBroker )
+ {
+ ContentBroker * pBroker = new ContentBroker( rSMgr, rArguments );
+
+ // Force init to be able to detect UCB init trouble immediately.
+ if ( pBroker->m_pImpl->initialize() )
+ m_pTheBroker = pBroker;
+ else
+ delete pBroker;
+ }
+ }
+
+ return m_pTheBroker != 0;
+}
+
+//=========================================================================
+// static
+sal_Bool ContentBroker::initialize(
+ const Reference< XMultiServiceFactory >& rSMgr,
+ const ContentProviderDataList & rData )
+{
+ OSL_ENSURE( !m_pTheBroker,
+ "ContentBroker::initialize - already initialized!" );
+
+ if ( !m_pTheBroker )
+ {
+ osl::Guard< osl::Mutex > aGuard( getGlobalContentBrokerMutex() );
+
+ if ( !m_pTheBroker )
+ {
+ ContentBroker * pBroker = new ContentBroker( rSMgr, rData );
+
+ // Force init to be able to detect UCB init trouble immediately.
+ if ( pBroker->m_pImpl->initialize() )
+ m_pTheBroker = pBroker;
+ else
+ delete pBroker;
+ }
+ }
+
+ return m_pTheBroker != 0;
+}
+
+//=========================================================================
+// static
+void ContentBroker::deinitialize()
+{
+ osl::MutexGuard aGuard( getGlobalContentBrokerMutex() );
+
+ delete m_pTheBroker;
+ m_pTheBroker = 0;
+}
+
+//=========================================================================
+// static
+ContentBroker* ContentBroker::get()
+{
+ return m_pTheBroker;
+}
+
+//=========================================================================
+//=========================================================================
+//
+// ContentBroker_Impl Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+ContentBroker_Impl::~ContentBroker_Impl()
+{
+ Reference< XComponent > xComponent( m_xProvider, UNO_QUERY );
+ if ( xComponent.is() )
+ {
+ m_xIdFac = 0;
+ m_xProvider = 0;
+ m_xProviderMgr = 0;
+
+ xComponent->dispose();
+ }
+}
+
+//=========================================================================
+bool ContentBroker_Impl::initialize()
+{
+ if ( !m_bInitDone )
+ {
+ osl::MutexGuard aGuard( m_aMutex );
+
+ if ( !m_bInitDone )
+ {
+ Reference< XInterface > xIfc;
+
+ if ( m_aProvData.size() > 0 )
+ {
+ try
+ {
+ xIfc = m_xSMgr->createInstance(
+ OUString::createFromAscii(
+ "com.sun.star.ucb.UniversalContentBroker" ) );
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ if ( xIfc.is() )
+ {
+ m_xProviderMgr
+ = Reference< XContentProviderManager >( xIfc, UNO_QUERY );
+
+ if ( m_xProviderMgr.is() )
+ {
+ if ( !configureUcb( m_xProviderMgr,
+ m_xSMgr,
+ m_aProvData,
+ 0 ) )
+ {
+ OSL_ENSURE( false, "Failed to configure UCB!" );
+ return false;
+ }
+ }
+ }
+ }
+ else
+ {
+ try
+ {
+ xIfc = m_xSMgr->createInstanceWithArguments(
+ OUString::createFromAscii(
+ "com.sun.star.ucb.UniversalContentBroker" ),
+ m_aArguments );
+ }
+ catch ( Exception const & )
+ {
+ }
+ }
+
+ OSL_ENSURE( xIfc.is(), "Error creating UCB service!" );
+
+ if ( !xIfc.is() )
+ return false;
+
+
+ m_xIdFac
+ = Reference< XContentIdentifierFactory >( xIfc, UNO_QUERY );
+
+ OSL_ENSURE( m_xIdFac.is(),
+ "UCB without required interface XContentIdentifierFactory!" );
+
+ if ( !m_xIdFac.is() )
+ return false;
+
+ m_xProvider = Reference< XContentProvider >( xIfc, UNO_QUERY );
+
+ OSL_ENSURE( m_xProvider.is(),
+ "UCB without required interface XContentProvider!" );
+
+ if ( !m_xProvider.is() )
+ return false;
+
+ if ( !m_xProviderMgr.is() )
+ m_xProviderMgr
+ = Reference< XContentProviderManager >( xIfc, UNO_QUERY );
+
+ OSL_ENSURE( m_xProviderMgr.is(),
+ "UCB without required interface XContentProviderManager!" );
+
+ if ( !m_xProviderMgr.is() )
+ return false;
+
+ m_xCommandProc = Reference< XCommandProcessor >( xIfc, UNO_QUERY );
+
+ OSL_ENSURE( m_xCommandProc.is(),
+ "UCB without required interface XCommandProcessor!" );
+
+ if ( !m_xCommandProc.is() )
+ return false;
+
+ // Everything okay.
+ m_bInitDone = sal_True;
+ }
+ }
+
+ return true;
+}
+
+} /* namespace ucbhelper */
+