Files
libreoffice/sw/source/ui/dbui/swdbtoolsclient.cxx
Peter Foley bda2003485 add pch support to gcc
Change-Id: I58c11477c1ce48185528db3a8013b5dccf3947c6
Reviewed-on: https://gerrit.libreoffice.org/2653
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
2013-03-11 09:48:32 +00:00

234 lines
8.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#include <com/sun/star/sdbc/XDataSource.hpp>
#include <com/sun/star/sdb/SQLContext.hpp>
#include <swdbtoolsclient.hxx>
#include <osl/diagnose.h>
#include <tools/solar.h>
using namespace ::connectivity::simple;
using namespace ::com::sun::star;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::sdb;
//====================================================================
//= SwDbtoolsClient
//====================================================================
namespace
{
// -----------------------------------------------------------------------------
// this namespace contains access to all static members of the class SwDbtoolsClient
// to make the initialize of the dll a little bit faster
// -----------------------------------------------------------------------------
::osl::Mutex& getDbtoolsClientMutex()
{
static ::osl::Mutex aMutex;
return aMutex;
}
// -----------------------------------------------------------------------------
sal_Int32& getDbToolsClientClients()
{
static sal_Int32 nClients = 0;
return nClients;
}
// -----------------------------------------------------------------------------
oslModule& getDbToolsClientModule()
{
static oslModule hDbtoolsModule = NULL;
return hDbtoolsModule;
}
// -----------------------------------------------------------------------------
createDataAccessToolsFactoryFunction& getDbToolsClientFactoryFunction()
{
static createDataAccessToolsFactoryFunction pFactoryCreationFunc = NULL;
return pFactoryCreationFunc;
}
// -----------------------------------------------------------------------------
}
SwDbtoolsClient::SwDbtoolsClient()
{
}
SwDbtoolsClient::~SwDbtoolsClient()
{
if(m_xDataAccessFactory.is())
{
// clear the factory _before_ revoking the client
// (the revocation may unload the DBT lib)
m_xDataAccessFactory = NULL;
// revoke the client
revokeClient();
}
}
#ifndef DISABLE_DYNLOADING
extern "C" { static void SAL_CALL thisModule() {} }
#else
extern "C" void * createDataAccessToolsFactory();
#endif
void SwDbtoolsClient::registerClient()
{
::osl::MutexGuard aGuard(getDbtoolsClientMutex());
if (1 == ++getDbToolsClientClients())
{
OSL_ENSURE(NULL == getDbToolsClientModule(), "SwDbtoolsClient::registerClient: inconsistence: already have a module!");
OSL_ENSURE(NULL == getDbToolsClientFactoryFunction(), "SwDbtoolsClient::registerClient: inconsistence: already have a factory function!");
#ifndef DISABLE_DYNLOADING
const ::rtl::OUString sModuleName(RTL_CONSTASCII_USTRINGPARAM(SVLIBRARY("dbtools")));
// load the dbtools library
getDbToolsClientModule() = osl_loadModuleRelative(
&thisModule, sModuleName.pData, 0);
OSL_ENSURE(NULL != getDbToolsClientModule(), "SwDbtoolsClient::registerClient: could not load the dbtools library!");
if (NULL != getDbToolsClientModule())
{
// get the symbol for the method creating the factory
const ::rtl::OUString sFactoryCreationFunc(RTL_CONSTASCII_USTRINGPARAM("createDataAccessToolsFactory"));
// reinterpret_cast<createDataAccessToolsFactoryFunction> removed for gcc permissive
getDbToolsClientFactoryFunction() = reinterpret_cast< createDataAccessToolsFactoryFunction >(
osl_getFunctionSymbol(getDbToolsClientModule(), sFactoryCreationFunc.pData));
if (NULL == getDbToolsClientFactoryFunction())
{ // did not find the symbol
OSL_FAIL("SwDbtoolsClient::registerClient: could not find the symbol for creating the factory!");
osl_unloadModule(getDbToolsClientModule());
getDbToolsClientModule() = NULL;
}
}
#else
getDbToolsClientFactoryFunction() = createDataAccessToolsFactory;
#endif
}
}
void SwDbtoolsClient::revokeClient()
{
::osl::MutexGuard aGuard(getDbtoolsClientMutex());
if (0 == --getDbToolsClientClients())
{
#ifndef DISABLE_DYNLOADING
getDbToolsClientFactoryFunction() = NULL;
if (getDbToolsClientModule())
osl_unloadModule(getDbToolsClientModule());
#endif
getDbToolsClientModule() = NULL;
}
}
void SwDbtoolsClient::getFactory()
{
if(!m_xDataAccessFactory.is())
{
registerClient();
if(getDbToolsClientFactoryFunction())
{ // loading the lib succeeded
void* pUntypedFactory = (*getDbToolsClientFactoryFunction())();
IDataAccessToolsFactory* pDBTFactory = static_cast<IDataAccessToolsFactory*>(pUntypedFactory);
OSL_ENSURE(pDBTFactory, "SwDbtoolsClient::SwDbtoolsClient: no factory returned!");
if (pDBTFactory)
{
m_xDataAccessFactory = pDBTFactory;
// by definition, the factory was aquired once
m_xDataAccessFactory->release();
}
}
}
}
::rtl::Reference< ::connectivity::simple::IDataAccessTools >
SwDbtoolsClient::getDataAccessTools()
{
if(!m_xDataAccessTools.is())
{
getFactory();
if(m_xDataAccessFactory.is())
m_xDataAccessTools = m_xDataAccessFactory->getDataAccessTools();
}
return m_xDataAccessTools;
}
::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion >
SwDbtoolsClient::getAccessTypeConversion()
{
if(!m_xAccessTypeConversion.is())
{
getFactory();
if(m_xDataAccessFactory.is())
m_xAccessTypeConversion = m_xDataAccessFactory->getTypeConversionHelper();
}
return m_xAccessTypeConversion;
}
Reference< XDataSource > SwDbtoolsClient::getDataSource(
const ::rtl::OUString& rRegisteredName,
const Reference<XComponentContext>& rxContext
)
{
Reference< XDataSource > xRet;
::rtl::Reference< ::connectivity::simple::IDataAccessTools > xAccess = getDataAccessTools();
if(xAccess.is())
xRet = xAccess->getDataSource(rRegisteredName, rxContext);
return xRet;
}
sal_Int32 SwDbtoolsClient::getDefaultNumberFormat(
const Reference< XPropertySet >& rxColumn,
const Reference< XNumberFormatTypes >& rxTypes,
const lang::Locale& rLocale
)
{
sal_Int32 nRet = -1;
::rtl::Reference< ::connectivity::simple::IDataAccessTools > xAccess = getDataAccessTools();
if(xAccess.is())
nRet = xAccess->getDefaultNumberFormat( rxColumn, rxTypes, rLocale);
return nRet;
}
::rtl::OUString SwDbtoolsClient::getFormattedValue(
const uno::Reference< beans::XPropertySet>& _rxColumn,
const uno::Reference< util::XNumberFormatter>& _rxFormatter,
const lang::Locale& _rLocale,
const util::Date& _rNullDate
)
{
::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion > xConversion =
getAccessTypeConversion();
rtl::OUString sRet;
if(xConversion.is())
sRet = xConversion->getFormattedValue(_rxColumn, _rxFormatter, _rLocale, _rNullDate);
return sRet;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */