3
* $Id: controladorextensiones.cpp 3668 2011-04-11 10:02:11Z tovar $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
14
#include <main/entorno.h>
15
#include <main/controllers/controladorextensiones.h>
16
#include "controladorlog.h"
17
#include <api/internacionalizacion.h>
25
#include <wx/filename.h>
26
#include <wx/config.h>
27
#include <wx/dynlib.h>
31
#if defined(__WXOSX__)
33
#define DLLEXT wxT("*.dylib")
34
#elif defined(__WXGTK__)
36
#define DLLEXT wxT("*.so")
37
#elif defined(_WINDOWS)
38
#define DLLEXT wxT("*.dll")
40
#error Plataforma no soportada
43
GNC::GCS::IControladorExtensiones::IControladorExtensiones() {}
44
GNC::GCS::IControladorExtensiones::~IControladorExtensiones() {}
46
GNC::ControladorExtensiones* GNC::ControladorExtensiones::m_pInstance = 0;
48
GNC::ControladorExtensiones::ControladorExtensiones()
51
for (GADVAPI::PrivateExtensionManager::iterator it= m_Manager.begin(); it != m_Manager.end(); ++it)
53
RegistrarModulo((*it).second->InitializeLibrary(GNC::Entorno::Instance()));
57
GNC::ControladorExtensiones::~ControladorExtensiones()
59
DesRegistrarModulos();
63
GNC::ControladorExtensiones* GNC::ControladorExtensiones::Instance()
65
if (m_pInstance == NULL) {
66
m_pInstance = new GNC::ControladorExtensiones();
71
void GNC::ControladorExtensiones::FreeInstance()
73
if (m_pInstance != NULL) {
79
void GNC::ControladorExtensiones::RegistrarModulo(GNC::GCS::IControladorModulo* pCtrlModulo)
82
if (pCtrlModulo == NULL) {
86
pCtrlModulo->RegistrarConfiguracion();
88
const std::string uid = pCtrlModulo->GetUID();
89
m_Modulos[uid] = pCtrlModulo;
90
std::string sidModulo = pCtrlModulo->GetSID();
91
std::transform(sidModulo.begin(), sidModulo.end(), sidModulo.begin(), (int(*)(int)) std::tolower);
92
m_SIDModulos[sidModulo] = uid;
93
NotificarRegistro(pCtrlModulo);
96
void GNC::ControladorExtensiones::DesRegistrarModulo(GNC::GCS::IControladorModulo* pCtrlModulo)
98
if (pCtrlModulo == NULL) {
102
NotificarDesRegistro(pCtrlModulo);
104
m_Modulos.erase(pCtrlModulo->GetUID());
105
std::string sidModulo = pCtrlModulo->GetSID();
106
std::transform(sidModulo.begin(), sidModulo.end(), sidModulo.begin(), (int(*)(int)) std::tolower);
107
m_SIDModulos.erase(sidModulo);
111
void GNC::ControladorExtensiones::DesRegistrarModulos()
113
GNC::ControladorExtensiones::IteradorListaModulos it;
115
for (it = m_Modulos.begin(); it != m_Modulos.end(); it++) {
116
GNC::GCS::IControladorModulo* item = (*it).second;
117
NotificarDesRegistro(item);
120
m_SIDModulos.clear();
124
GNC::GCS::IControladorModulo* GNC::ControladorExtensiones::ObtenerModulo(const std::string& idModulo)
126
GNC::GCS::IControladorModulo* cm = NULL;
127
IteradorListaModulos it = m_Modulos.find(idModulo);
128
if (it != m_Modulos.end()) {
134
GNC::GCS::IControladorModulo* GNC::ControladorExtensiones::ObtenerModuloSID(const std::string& sidModulo)
136
GNC::GCS::IControladorModulo* cm = NULL;
137
IteradorListaSIDModulos it = m_SIDModulos.find(sidModulo);
138
if (it != m_SIDModulos.end()) {
139
cm = ObtenerModulo((*it).second);
146
bool compareListaModulos(GNC::GCS::IControladorModulo* s1, GNC::GCS::IControladorModulo* s2)
148
return s1->GetPriority()< s2->GetPriority();
151
std::list<GNC::GCS::IControladorModulo*> GNC::ControladorExtensiones::ModulosOrdenados()
153
std::list<GNC::GCS::IControladorModulo*> listaModulosPriorizados;
154
for(ListaModulos::iterator it = m_Modulos.begin(); it!= m_Modulos.end(); ++it)
156
listaModulosPriorizados.push_back((*it).second);
159
listaModulosPriorizados.sort(compareListaModulos);
161
return listaModulosPriorizados;
164
const GNC::ControladorExtensiones::ListaModulos& GNC::ControladorExtensiones::Modulos() const
169
const GNC::ControladorExtensiones::ListaSIDModulos& GNC::ControladorExtensiones::SIDModulos() const
174
// Realización de la interfaz IControladorExtensiones
175
GADVAPI::PrivateExtensionManager& GNC::ControladorExtensiones::GetPrivateExtensionsManager()
180
void GNC::ControladorExtensiones::NotificarRegistro(GNC::GCS::IControladorModulo* pModulo)
182
GNC::Entorno* pEntorno = GNC::Entorno::Instance();
183
Entorno::ListaObservadoresExtensiones::const_iterator it;
184
for (it = pEntorno->ObservadoresExtensiones.begin(); it != pEntorno->ObservadoresExtensiones.end(); it++) {
185
GNC::GCS::IObservadorExtensiones* ne = *it;
186
ne->OnModuloCargado(pModulo);
190
void GNC::ControladorExtensiones::NotificarDesRegistro(GNC::GCS::IControladorModulo* pModulo)
192
GNC::Entorno* pEntorno = GNC::Entorno::Instance();
193
Entorno::ListaObservadoresExtensiones::const_iterator it;
194
for (it = pEntorno->ObservadoresExtensiones.begin(); it != pEntorno->ObservadoresExtensiones.end(); it++) {
195
GNC::GCS::IObservadorExtensiones* ne = *it;
196
ne->OnModuloDescargado(pModulo);
200
//-------------------------------------------------------------------------------------------
203
inline std::wstring StringToWString(const std::string& str) {
204
std::wstring temp(str.length(),L' ');
205
std::copy(str.begin(), str.end(), temp.begin());
209
//-------------------------------------------------------------------------------------------
210
// PrivateExtensionManager
212
GADVAPI::PrivateExtensionManager::PrivateExtensionManager() : GADVAPI::PrivateExtensionManager::Base()
217
GADVAPI::PrivateExtensionManager::~PrivateExtensionManager()
222
PrivateExtension* GADVAPI::PrivateExtensionManager::GetExtension(std::string nombre)
225
if (base.find(nombre) != base.end()) {
232
void GADVAPI::PrivateExtensionManager::Load()
237
wxString rutas[1] = {
238
FROMPATH(GNC::Entorno::Instance()->GetPluginsPath())
243
for (int i = 0; i < 1; i++) {
244
if (dir.Exists(rutas[i]) && dir.Open(rutas[i])) {
245
bool cont = dir.GetFirst(&fileName, DLLEXT, wxDIR_FILES);
247
filePath = rutas[i] + wxFileName::GetPathSeparator() + fileName;
249
//se busca el punto de entrada...
250
wxDynamicLibrary* dll = new wxDynamicLibrary();
251
//std::cout << "Trying to load: " << std::string(TOPATH(filePath)).c_str() << std::endl;
252
if (dll->Load(filePath)) {
253
//std::cout << "Library loaded" << std::endl;
256
//std::cout << "Fallo al cargar" << std::endl;
260
//std::cout << "Lib not loaded!" << std::endl;
265
//Create a valid function pointer using the function pointer type in plugin.h
266
wxDYNLIB_FUNCTION(CreatePrivateExtension_function,CreatePrivateExtensionDebug,*dll);
267
//check if the function is found
268
if(pfnCreatePrivateExtensionDebug)
270
PrivateExtension* pExtension = pfnCreatePrivateExtensionDebug();
272
//Create a valid function pointer using the function pointer type in plugin.h
273
wxDYNLIB_FUNCTION(CreatePrivateExtension_function,CreatePrivateExtension,*dll);
274
//check if the function is found
275
if(pfnCreatePrivateExtension)
277
PrivateExtension* pExtension = pfnCreatePrivateExtension();
279
if (Registrar(pExtension)) {
280
pExtension->AsignPath(std::string(TOPATH(filePath)));
281
m_instancias.push_back(dll);
290
cont = dir.GetNext(&fileName);
299
void GADVAPI::PrivateExtensionManager::UnLoad()
302
//delete private extensions
303
for (Base::iterator it = Base::begin(); it != Base::end(); ++it) {
307
for(ListaInstancias::iterator it = m_instancias.begin(); it != m_instancias.end(); it++)
311
m_instancias.clear();
317
void GADVAPI::PrivateExtensionManager::Reload()
323
GADVAPI::PrivateExtensionManager::iterator GADVAPI::PrivateExtensionManager::begin() {
324
return Base::begin();
327
GADVAPI::PrivateExtensionManager::iterator GADVAPI::PrivateExtensionManager::end() {
331
bool GADVAPI::PrivateExtensionManager::Registrar(PrivateExtension* ext)
333
if (ext->GetCoreVersion() != GINKGO_VERSION || ext->GetCoreSubVersion() != GINKGO_SUB_VERSION)
335
LOG_WARN("Extensions", _Std("Extension ") << ext->GetSID() << "(" << ext->GetPath() << ")"<< _Std(" is compatible with Ginkgo CADx ") << ext->GetCoreVersion() << "." << ext->GetCoreSubVersion());
339
const std::string& sid = ext->GetSID();
340
Base::iterator it = base.find(sid);
341
if (it == base.end()) {
345
//error extension registrada dos veces