-
Notifications
You must be signed in to change notification settings - Fork 0
/
plugin.cpp
38 lines (30 loc) · 1.34 KB
/
plugin.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "plugin.hpp"
#include <dlfcn.h> // dlopen, dlsym, dlclose
#include <iostream> // std::cout
/** ***************************************************************************
* Esta función brinda compatibilidad con strings de C++.
* @param s Ruta de la biblioteca a abrir
* @param c Control de la aplicación
* @return Objeto de un tipo que hereda de restbed::Resource.
** ***************************************************************************/
std::shared_ptr< restbed::Resource > d::plugin(const std::string& s, std::shared_ptr< Control > c)
{
return plugin ( s.c_str(), c );
}
/** ***************************************************************************
* Abre la biblioteca, carga la factoría, y obtiene un objeto Plugin.
* @param s Ruta de la biblioteca a abrir
* @param c Control de la aplicación
* @return Objeto de un tipo que hereda de restbed::Resource.
** ***************************************************************************/
std::shared_ptr< restbed::Resource > d::plugin(const char *s, std::shared_ptr< Control > c)
{
auto lib = dlopen ( s, RTLD_LAZY );
if (!lib)
throw std::runtime_error( dlerror() );
auto factory = (d::PluginFactory*) dlsym ( lib, "pluginFactory" );
if (!factory)
throw std::runtime_error( dlerror() );
auto plugin = factory->get( c );
return plugin;
}