101 lines
2.4 KiB
C++
101 lines
2.4 KiB
C++
/* This file is part of Om. Copyright (C) 2006 Dave Robillard.
|
|
*
|
|
* Om is free software; you can redistribute it and/or modify it under the
|
|
* terms of the GNU General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* Om 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 General Public License for details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
#ifndef PLUGINLIBRARY_H
|
|
#define PLUGINLIBRARY_H
|
|
|
|
#include <dlfcn.h>
|
|
#include <string>
|
|
#include <iostream>
|
|
using std::string;
|
|
using std::cerr; using std::endl;
|
|
|
|
|
|
namespace Om {
|
|
|
|
|
|
/** Representation of a shared library containing at least one Plugin.
|
|
*
|
|
* In the NodeFactory, this represents one loaded shared library instance,
|
|
* which is what handle() returns.
|
|
*/
|
|
class PluginLibrary
|
|
{
|
|
public:
|
|
/** Construct a new PluginLibrary.
|
|
*
|
|
* Path is assumed to be the path of a valid shared library that can be
|
|
* successfully dlopen'ed.
|
|
*/
|
|
PluginLibrary(const string& path)
|
|
: m_path(path), m_handle(NULL)
|
|
{}
|
|
|
|
~PluginLibrary()
|
|
{
|
|
close();
|
|
}
|
|
|
|
/** Load and resolve all symbols in this shared library
|
|
* (dlopen with RTLD_NOW).
|
|
*
|
|
* It is okay to call this many times, the library will only be opened
|
|
* once.
|
|
*/
|
|
void open()
|
|
{
|
|
if (m_handle == NULL) {
|
|
dlerror();
|
|
m_handle = dlopen(m_path.c_str(), RTLD_NOW);
|
|
if (m_handle == NULL)
|
|
cerr << "[PluginLibrary] Warning: Error opening shared library "
|
|
<< m_path << "(" << dlerror() << ")" << endl;
|
|
}
|
|
}
|
|
|
|
/** Close the dynamic library.
|
|
*
|
|
* This can be called on an already closed PluginLibrary without problems.
|
|
*/
|
|
void close()
|
|
{
|
|
if (m_handle != NULL) {
|
|
dlerror();
|
|
if (dlclose(m_handle))
|
|
cerr << "[PluginLibrary] Error closing shared library " << m_path
|
|
<< "(" << dlerror() << ")" << endl;
|
|
}
|
|
m_handle = NULL;
|
|
}
|
|
|
|
void* handle() const { return m_handle; }
|
|
|
|
private:
|
|
// Disallow copies (undefined)
|
|
PluginLibrary(const PluginLibrary&);
|
|
PluginLibrary& operator=(const PluginLibrary&);
|
|
|
|
string m_path;
|
|
void* m_handle;
|
|
};
|
|
|
|
|
|
} // namespace Om
|
|
|
|
#endif // PLUGINLIBRARY_H
|
|
|