blob: abc1c89025abc5d49815b6ec9e7d611c681e4559 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#ifndef _SALHELPER_DYNLOAD_HXX_
#define _SALHELPER_DYNLOAD_HXX_
#include <sal/types.h>
#include <rtl/ustring.hxx>
#include <osl/module.h>
namespace salhelper
{
/** The ORealDynamicLoader is an implementation helper class for the template loader ODynamicLoader.
*/
class ORealDynamicLoader
{
public:
/** initializes the loader, loads the library and call the initialization fucntion.
@param ppSetToZeroInDestructor points to the loader instance which must be set to NULL
if the loader will be destroyed.
@param strModuleName specifies the library name.
@param strInitFunction specifies the name of the initialization function.
*/
static ORealDynamicLoader* SAL_CALL newInstance(
ORealDynamicLoader ** ppSetToZeroInDestructor,
const ::rtl::OUString& strModuleName,
const ::rtl::OUString& strInitFunction );
/// increase the reference count.
sal_uInt32 SAL_CALL acquire();
/// decrease the reference count and delete the last instance.
sal_uInt32 SAL_CALL release();
/// returns a poiner to the initialized API function structure.
void* SAL_CALL getApi() const;
protected:
/** Constructor.
@param ppSetToZeroInDestructor points to the loader instance which must be set to NULL
if the loader will be destroyed.
@param strModuleName specifies the library name.
@param strInitFunction specifies the name of the initialization function.
@param pApi points to a structure with the initialized API function pointers.
@param pModule points to the loaded library handle.
*/
ORealDynamicLoader( ORealDynamicLoader ** ppSetToZeroInDestructor,
const ::rtl::OUString& strModuleName,
const ::rtl::OUString& strInitFunction,
void* pApi,
oslModule pModule );
/// Destructor, try to unload the library.
virtual ~ORealDynamicLoader();
/// points to the structure with the initialzed API function pointers.
void* m_pApi;
/// stores the reference count.
sal_uInt32 m_refCount;
/// stores the library handle.
oslModule m_pModule;
/// stores the library name.
::rtl::OUString m_strModuleName;
/// stores the name of the initialization function.
::rtl::OUString m_strInitFunction;
/** stores a pointer to itself, which must be reset in the destructor to signal
that the loader is invalid.
*/
ORealDynamicLoader ** ppSetToZeroInDestructor;
};
/** The ODynmaicLoader provides a special load on call mechanism for dynamic libraries
which support a C-API.
The libraries must provide a struct with function pointers for all supported C functions.
The loader loads the specified library and call the specified initialization function
to initialize the function pointers with the real functions. Furthermore provides the
loader a reference counter for the library. When the last instance of the laoder will
be destroyed the loader will unload the library.
@deprecated
Do not use.
*/
template<class API>
class ODynamicLoader
{
public:
/// Default constructor
ODynamicLoader() SAL_THROW(())
{
m_pLoader = 0;
}
/** Constructor, loads the library if necessary otherwise the refernece count will
be increased.
@param strModuleName specifies the library name.
@param strInitFunction specifies the name of the initialization function.
*/
ODynamicLoader( const ::rtl::OUString& strModuleName,
const ::rtl::OUString& strInitFunction ) SAL_THROW(())
{
if (!m_pStaticLoader)
{
m_pStaticLoader = ORealDynamicLoader::newInstance(
&m_pStaticLoader,
strModuleName,
strInitFunction);
}
else
{
m_pStaticLoader->acquire();
}
m_pLoader = m_pStaticLoader;
}
/// Copy constructor
ODynamicLoader(const ODynamicLoader<API>& toCopy) SAL_THROW(())
{
m_pLoader = toCopy.m_pLoader;
if( m_pLoader )
m_pLoader->acquire();
}
/// Destructor, decrease the reference count and unload the library if it is tha last instance.
~ODynamicLoader() SAL_THROW(())
{
if( m_pLoader )
m_pLoader->release();
}
/// Assign operator
ODynamicLoader<API>& SAL_CALL operator = (const ODynamicLoader<API>& toAssign) SAL_THROW(())
{
if( m_pLoader != toAssign.m_pLoader )
{
if( toAssign.m_pLoader )
toAssign.m_pLoader->acquire();
if( m_pLoader )
m_pLoader->release();
m_pLoader = toAssign.m_pLoader;
}
return (*this);
}
/// returns a poiner to the initialized API function structure.
API* SAL_CALL getApi() const SAL_THROW(())
{
return (API*)m_pLoader->getApi();
}
/// cast operator, which cast to a poiner with the initialized API function structure.
API* SAL_CALL operator->() const SAL_THROW(())
{
return (API*)m_pLoader->getApi();
}
/// checks if the loader works on a loaded and initialized library.
sal_Bool SAL_CALL isLoaded() const SAL_THROW(())
{
return (m_pLoader != NULL);
}
protected:
/// stores the real loader helper instance
static ORealDynamicLoader* m_pStaticLoader;
ORealDynamicLoader* m_pLoader;
};
template<class API>
ORealDynamicLoader* ODynamicLoader<API>::m_pStaticLoader = NULL;
}
#endif