4 #include <boost/foreach.hpp>
5 #include <boost/filesystem.hpp>
6 #include <boost/format.hpp>
8 #include <ozulis/compiler.hh>
9 #include <ozulis/core/assert.hh>
10 #include "plugin-manager.hh"
12 namespace fs
= boost::filesystem
;
14 template class ozulis::core::Singleton
<ozulis::PluginManager
>;
15 template class std::vector
<ozulis::LanguagePlugin
*>;
19 PluginManager::PluginManager()
20 : core::Singleton
<PluginManager
>(),
26 PluginManager::~PluginManager()
28 BOOST_FOREACH (Plugin
* plugin
, languages_
)
30 void * handle
= plugin
->handle
;
36 PluginManager::addPluginPath(const fs::path
& path
)
38 if (!fs::is_directory(path
) || pluginPathes_
.count(path
) > 0)
41 pluginPathes_
.insert(path
);
46 PluginManager::loadPlugin(const fs::path
& path
)
48 if (!fs::is_regular_file(path
))
51 void * handle
= dlopen(path
.string().c_str(), RTLD_LAZY
);
53 Plugin
* plugin
= reinterpret_cast<Plugin
*> (dlsym(handle
, "ozulis_plugin"));
55 plugin
->handle
= handle
;
57 switch (plugin
->type())
59 case Plugin::Language
:
60 registerPlugin(reinterpret_cast<LanguagePlugin
*> (plugin
));
62 default: assert(false);
67 PluginManager::loadPlugins(const fs::path
& path
)
69 assert(fs::is_directory(path
));
71 for (fs::directory_iterator
it(path
), end
; it
!= end
; ++it
)
72 loadPlugin(it
->path());
76 PluginManager::registerPlugin(LanguagePlugin
* plugin
)
78 languages_
.push_back(plugin
);
82 PluginManager::createParserByExtension(const std::string
& extension
) const
84 BOOST_FOREACH(LanguagePlugin
* plugin
, languages_
)
85 BOOST_FOREACH(const std::string
& langExtension
, plugin
->extensions())
86 if (extension
== langExtension
)
87 return plugin
->createParser();
88 Compiler::instance().error(
89 (boost::format(_("No plugin to handle `%1%' file extension."))