20#include <config_features.h>
24#include <core_resource.hxx>
29#include <com/sun/star/beans/PropertyAttribute.hpp>
30#include <com/sun/star/beans/XPropertySet.hpp>
31#include <com/sun/star/document/MacroExecMode.hpp>
32#include <com/sun/star/frame/Desktop.hpp>
33#include <com/sun/star/frame/TerminationVetoException.hpp>
34#include <com/sun/star/frame/XLoadable.hpp>
35#include <com/sun/star/frame/XModel.hpp>
36#include <com/sun/star/frame/XModel2.hpp>
37#include <com/sun/star/frame/XTerminateListener.hpp>
38#include <com/sun/star/lang/DisposedException.hpp>
39#include <com/sun/star/registry/InvalidRegistryException.hpp>
40#include <com/sun/star/sdbc/XDataSource.hpp>
41#include <com/sun/star/task/InteractionClassification.hpp>
42#include <com/sun/star/ucb/InteractiveIOException.hpp>
43#include <com/sun/star/ucb/IOErrorCode.hpp>
44#include <com/sun/star/uri/UriReferenceFactory.hpp>
45#include <com/sun/star/task/InteractionHandler.hpp>
46#include <com/sun/star/util/CloseVetoException.hpp>
47#include <com/sun/star/util/XCloseable.hpp>
79using namespace ::
cppu;
83using ::com::sun::star::task::InteractionClassification_ERROR;
84using ::com::sun::star::ucb::IOErrorCode_NO_FILE;
85using ::com::sun::star::ucb::InteractiveIOException;
86using ::com::sun::star::ucb::IOErrorCode_NOT_EXISTING;
87using ::com::sun::star::ucb::IOErrorCode_NOT_EXISTING_PATH;
92 typedef ::cppu::WeakImplHelper< XTerminateListener
116 virtual void SAL_CALL
queryTermination(
const lang::EventObject& Event )
override;
117 virtual void SAL_CALL
notifyTermination(
const lang::EventObject& Event )
override;
119 virtual void SAL_CALL
disposing(
const css::lang::EventObject& Source )
override;
138 for(
const auto& pCopy : aCpy )
142 const Reference< XModel2 > xMod( pCopy->getModel_noCreate(),
144 if( !xMod->getControllers()->hasMoreElements() )
146 Reference< util::XCloseable > xClose( xMod,
148 xClose->close(
false );
151 catch(
const CloseVetoException& )
153 throw TerminationVetoException();
175#if HAVE_FEATURE_SCRIPTING
191#if HAVE_FEATURE_SCRIPTING
204 return "com.sun.star.comp.dba.ODatabaseContext";
214 return {
"com.sun.star.sdb.DatabaseContext" };
220 Reference< XDataSource > xDataSource( pImpl->getOrCreateDataSource() );
237 Reference< XInterface > xDataSource;
238 if ( !sURL.isEmpty() )
241 if ( !xDataSource.is() )
251 css::lang::EventObject aDisposeEvent(
static_cast< XContainer*
>(
this));
258 for (
auto const& elem : objCopy)
271 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
275 if ( sURL.isEmpty() )
277 throw IllegalArgumentException();
280 Reference< XInterface > xExistent =
getObject( sURL );
281 if ( xExistent.is() )
291 if (
aURL.GetProtocol() == INetProtocol::NotValid )
292 throw NoSuchElementException( _rName, *
this );
294 bool bEmbeddedDataSource =
aURL.isSchemeEqualTo(INetProtocol::VndSunStarPkg);
297 if (!bEmbeddedDataSource)
301 throw InteractiveIOException(
302 _sURL, *
this, InteractionClassification_ERROR, IOErrorCode_NO_FILE
306 catch (
const InteractiveIOException& e )
308 if ( ( e.Code == IOErrorCode_NO_FILE )
309 || ( e.Code == IOErrorCode_NOT_EXISTING )
310 || ( e.Code == IOErrorCode_NOT_EXISTING_PATH )
314 OUString sErrorMessage(
DBA_RES( RID_STR_FILE_DOES_NOT_EXIST ) );
320 throw WrappedTargetException( _sURL, *
this,
Any( aError ) );
322 throw WrappedTargetException( _sURL, *
this, ::cppu::getCaughtException() );
326 throw WrappedTargetException( _sURL, *
this, ::cppu::getCaughtException() );
330 "ODatabaseContext::loadObjectFromURL: not intended for already-cached objects!" );
336 Reference< XModel >
xModel( pModelImpl->createNewModel_deliverOwnership(), UNO_SET_THROW );
337 Reference< XLoadable > xLoad(
xModel, UNO_QUERY_THROW );
340 aArgs.
put(
"URL", _sURL );
341 aArgs.
put(
"MacroExecutionMode", MacroExecMode::USE_CONFIG );
342 aArgs.
put(
"InteractionHandler", task::InteractionHandler::createWithParent(
m_aContext,
nullptr) );
343 if (bEmbeddedDataSource)
346 auto const uri = css::uri::UriReferenceFactory::create(
m_aContext)->parse(_sURL);
347 if (uri.is() && uri->isAbsolute()
348 && uri->hasAuthority() && !uri->hasQuery() && !uri->hasFragment())
350 auto const auth = uri->getAuthority();
351 auto const decAuth = rtl::Uri::decode(
352 auth, rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8);
353 if (auth.isEmpty() == decAuth.isEmpty()) {
355 OUString sBaseURI = decAuth + uri->getPath();
356 aArgs.
put(
"BaseURI", sBaseURI);
360 "<" << _sURL <<
"> cannot be parse as vnd.sun.star.pkg URL");
364 "dbaccess.core",
"<" << _sURL <<
"> cannot be parse as vnd.sun.star.pkg URL");
369 xLoad->load( aResource );
370 xModel->attachResource( _sURL, aResource );
377 return pModelImpl->getOrCreateDataSource();
396 OUString sAuthFailedPassword;
399 for (
auto const & prop : rSessionPersistentProps )
401 if ( prop.Name ==
"AuthFailedPassword" )
403 OSL_VERIFY( prop.Value >>= sAuthFailedPassword );
407 xDSProps->setPropertyValue( prop.Name, prop.Value );
421 if ( _rName.isEmpty() )
422 throw IllegalArgumentException( OUString(), *
this, 1 );
424 Reference< XDocumentDataSource > xDocDataSource( _rxObject, UNO_QUERY );
425 Reference< XModel >
xModel( xDocDataSource.is() ? xDocDataSource->getDatabaseDocument() : Reference< XOfficeDatabaseDocument >(), UNO_QUERY );
427 throw IllegalArgumentException( OUString(), *
this, 2 );
429 OUString sURL =
xModel->getURL();
430 if ( sURL.isEmpty() )
431 throw IllegalArgumentException(
DBA_RES( RID_STR_DATASOURCE_NOT_STORED ), *
this, 2 );
435 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
443 ContainerEvent
aEvent(
static_cast<XContainer*
>(
this),
Any(_rName),
Any(_rxObject),
Any());
455 Reference< XPropertySetInfo > xSetInfo;
457 xSetInfo = xSource->getPropertySetInfo();
464 if ( ( ( rProperty.Attributes & PropertyAttribute::TRANSIENT) != 0 )
465 && ( ( rProperty.Attributes & PropertyAttribute::READONLY) == 0 )
469 aRememberProps.
put( rProperty.Name, xSource->getPropertyValue( rProperty.Name ) );
482 OUString sDocumentURL( _rModelImpl.
getURL() );
489 OSL_FAIL(
"ODatabaseContext::storeTransientProperties: a database document register by name? This shouldn't happen anymore!" );
495 OSL_ENSURE( sDocumentURL.isEmpty() && _rModelImpl.
m_sName.isEmpty() ,
496 "ODatabaseContext::storeTransientProperties: a non-empty data source which I do not know?!" );
512 ClearableMutexGuard aGuard(
m_aMutex);
513 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
590 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
599 return new ::comphelper::OEnumerationByName(
static_cast<XNameAccess*
>(
this));
606 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
607 if ( _rName.isEmpty() )
608 throw NoSuchElementException(_rName, *
this);
612 Reference< XInterface > xExistent =
getObject( _rName );
613 if ( xExistent.is() )
614 return Any( xExistent );
628 if ( !xExistent.is() )
631 return Any( xExistent );
633 catch (
const NoSuchElementException&)
637 catch (
const WrappedTargetException&)
647 Any aError = ::cppu::getCaughtException();
648 throw WrappedTargetException(_rName, *
this, aError );
655 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
663 ::connectivity::checkDisposed(DatabaseAccessContext_Base::rBHelper.bDisposed);
671 Reference< XInterface > xExistent;
673 xExistent = aFind->second->getOrCreateDataSource();
679 OUString sURL( _rModelImpl.
getURL() );
680 SAL_INFO(
"dbaccess.core",
"DatabaseContext: registering " << sURL);
687 OSL_FAIL(
"ODatabaseContext::registerDatabaseDocument: already have an object registered for this URL!" );
692 const OUString& sURL( _rModelImpl.
getURL() );
693 SAL_INFO(
"dbaccess.core",
"DatabaseContext: deregistering " << sURL);
699 SAL_INFO(
"dbaccess.core",
"DatabaseContext: changing registrations from " << _rOldURL <<
712#if !HAVE_FEATURE_SCRIPTING
713 (void) _rxForDocument;
714 (void) _rBasicManager;
717 Reference< XOfficeDatabaseDocument > xDatabaseDocument( _rxForDocument, UNO_QUERY );
719 if ( !xDatabaseDocument.is() )
721 Reference< XChild > xDocAsChild( _rxForDocument, UNO_QUERY );
722 if ( xDocAsChild.is() )
723 xDatabaseDocument.set( xDocAsChild->getParent(), UNO_QUERY );
727 if ( xDatabaseDocument.is() )
735extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
737 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const& )
PropertiesInfo aProperties
void SetGlobalUNOConstant(const OUString &rName, const css::uno::Any &_rValue, css::uno::Any *pOldValue=nullptr)
static void registerCreationListener(BasicManagerCreationListener &_rListener)
static void revokeCreationListener(BasicManagerCreationListener &_rListener)
bool put(const OUString &_rValueName, const VALUE_TYPE &_rValue)
css::uno::Sequence< css::beans::PropertyValue > getPropertyValues() const
VALUE_TYPE getOrDefault(const OUString &_rValueName, const VALUE_TYPE &_rDefault) const
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
void disposeAndClear(const css::lang::EventObject &rEvt)
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
css::uno::Type const & get()
void remove(const ODatabaseModelImpl &_rModelImpl)
virtual void SAL_CALL queryTermination(const lang::EventObject &Event) override
DatabaseDocumentLoader(const Reference< XComponentContext > &rxContext)
void append(const ODatabaseModelImpl &_rModelImpl)
Reference< XDesktop2 > m_xDesktop
virtual void SAL_CALL notifyTermination(const lang::EventObject &Event) override
std::vector< const ODatabaseModelImpl * > m_aDatabaseDocuments
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual void SAL_CALL changeDatabaseLocation(const OUString &Name, const OUString &NewLocation) override
virtual void SAL_CALL registerObject(const OUString &Name, const css::uno::Reference< css::uno::XInterface > &Object) override
ODatabaseContext(const css::uno::Reference< css::uno::XComponentContext > &)
virtual void SAL_CALL removeDatabaseRegistrationsListener(const css::uno::Reference< css::sdb::XDatabaseRegistrationsListener > &Listener) override
css::uno::Reference< css::uno::XComponentContext > m_aContext
void removeFromTerminateListener(const ODatabaseModelImpl &_rDataSourceModel)
virtual css::uno::Sequence< OUString > SAL_CALL getRegistrationNames() override
css::uno::Reference< css::uno::XAggregation > m_xDBRegistrationAggregate
virtual OUString SAL_CALL getDatabaseLocation(const OUString &Name) override
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getRegisteredObject(const OUString &Name) override
void databaseDocumentURLChange(const OUString &_sOldName, const OUString &_sNewName)
virtual sal_Bool SAL_CALL isDatabaseRegistrationReadOnly(const OUString &Name) override
virtual void onBasicManagerCreated(const css::uno::Reference< css::frame::XModel > &_rxForDocument, BasicManager &_rBasicManager) override
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override
PropertyCache m_aDatasourceProperties
virtual void SAL_CALL addDatabaseRegistrationsListener(const css::uno::Reference< css::sdb::XDatabaseRegistrationsListener > &Listener) override
virtual void SAL_CALL disposing() override
virtual void SAL_CALL addContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
virtual void SAL_CALL removeContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
::comphelper::OInterfaceContainerHelper3< css::container::XContainerListener > m_aContainerListeners
std::map< OUString, ODatabaseModelImpl * > ObjectCache
void setTransientProperties(const OUString &_sURL, ODatabaseModelImpl &_rDataSourceModel)
sets all properties which were transient at the data source.
virtual OUString SAL_CALL getImplementationName() override
virtual sal_Bool SAL_CALL hasElements() override
void storeTransientProperties(ODatabaseModelImpl &_rModelImpl)
void registerDatabaseDocument(ODatabaseModelImpl &_rModelImpl)
virtual void SAL_CALL revokeObject(const OUString &Name) override
void revokeDatabaseDocument(const ODatabaseModelImpl &_rModelImpl)
virtual sal_Bool SAL_CALL hasRegisteredDatabase(const OUString &Name) override
css::uno::Reference< css::uno::XInterface > loadObjectFromURL(const OUString &_rName, const OUString &_sURL)
loads the given object from the given URL
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual ~ODatabaseContext() override
void appendAtTerminateListener(const ODatabaseModelImpl &_rDataSourceModel)
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance() override
virtual void SAL_CALL revokeDatabaseLocation(const OUString &Name) override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL registerDatabaseLocation(const OUString &Name, const OUString &Location) override
ObjectCache m_aDatabaseObjects
virtual css::uno::Any SAL_CALL getByName(const OUString &aName) override
virtual css::uno::Type SAL_CALL getElementType() override
css::uno::Reference< css::sdb::XDatabaseRegistrations > m_xDatabaseRegistrations
css::uno::Reference< css::uno::XInterface > getObject(const OUString &_rURL)
rtl::Reference< DatabaseDocumentLoader > m_xDatabaseDocumentLoader
css::uno::Reference< css::uno::XInterface > impl_createNewDataSource()
creates a new data source
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments(const css::uno::Sequence< css::uno::Any > &_rArguments) override
virtual sal_Bool SAL_CALL hasByName(const OUString &aName) override
const OUString & getURL() const
css::uno::Reference< css::sdbc::XDataSource > getOrCreateDataSource()
returns the data source.
OUString m_sFailedPassword
static void setName(const css::uno::Reference< css::sdb::XDocumentDataSource > &_rxDocument, const OUString &_rNewName, DBContextAccess)
sets a new name for the data source
OUString get(NOTATION _eOutputNotation) const
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_dba_ODatabaseContext_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
Reference< XComponentContext > m_aContext
#define ENSURE_OR_THROW(c, m)
#define DBG_UNHANDLED_EXCEPTION(...)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
Reference< XComponentContext > getProcessComponentContext()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
::cppu::WeakComponentImplHelper< css::lang::XServiceInfo, css::sdb::XDatabaseContext > DatabaseAccessContext_Base
Reference< XAggregation > createDataSourceRegistrations(const Reference< XComponentContext > &_rxContext)
::cppu::WeakImplHelper< XTerminateListener > DatabaseDocumentLoader_Base
constexpr OUStringLiteral INFO_POOLURL
Reference< XModel > xModel
the model of the sub component. Might be <NULL>