summaryrefslogtreecommitdiff
path: root/server/src/modules_handler.cpp
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2015-03-27 16:07:27 +0300
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2015-03-27 16:07:27 +0300
commitff44c9cd55bff146c6c47277656a967045184c7b (patch)
treeb1d5d59696c8811db0badea0e6dcedca3601b183 /server/src/modules_handler.cpp
parentf87e3320c499edccd545ff3bfc244ef5c7216bb5 (diff)
working module loader
basic program options support abitilty to print installed modules info started config support implementation
Diffstat (limited to 'server/src/modules_handler.cpp')
-rw-r--r--server/src/modules_handler.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/server/src/modules_handler.cpp b/server/src/modules_handler.cpp
new file mode 100644
index 0000000..a6dbcef
--- /dev/null
+++ b/server/src/modules_handler.cpp
@@ -0,0 +1,142 @@
+/*
+ Copyright © 2015 Gluzskiy Alexandr (sss)
+
+ This file is part of Unknown Download Manager (UDM).
+
+ UDM 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.
+
+ UDM 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 more details.
+
+ You should have received a copy of the GNU General Public License
+ along with UDM. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "modules_handler.h"
+#include <unistd.h>
+#include <dlfcn.h>
+#include <string>
+
+#include <boost/filesystem.hpp>
+
+
+#include <iostream>
+
+extern core_api *module_api;
+
+
+void modules_handler::load_metadata_modules(const std::string &path)
+{
+ if(boost::filesystem::exists(path) && boost::filesystem::is_directory(path))
+ {
+ for(boost::filesystem::directory_iterator i(path), end = boost::filesystem::directory_iterator(); i != end; ++i)
+ {
+ void *lib = dlopen(i->path().generic_string().c_str(), RTLD_LAZY);
+ if(!lib)
+ {
+ printf("failed to open library \"%s\" with error: %s\n", i->path().c_str(), dlerror());
+ return;
+ }
+ void *fptr = dlsym(lib, "udm_metadata_module_load");
+ if(!fptr)
+ {
+ printf("failed to find symbol \"udm_metadata_module_load\" in library %s with error %s\n", i->path().c_str(), dlerror());
+ dlclose(lib);
+ return;
+ }
+ void *(*f)(void);
+ f = (void* (*)())fptr;
+ //TODO: aditional sanity checks
+ module_metadata_storage *m = static_cast<module_metadata_storage*>(f());
+ m->load(module_api);
+ metadata_modules.push_back(m);
+ }
+ }
+}
+
+void modules_handler::load_downloader_modules(const std::string &path)
+{
+ if(boost::filesystem::exists(path) && boost::filesystem::is_directory(path))
+ {
+ for(boost::filesystem::directory_iterator i(path), end = boost::filesystem::directory_iterator(); i != end; ++i)
+ {
+ void *lib = dlopen(i->path().generic_string().c_str(), RTLD_LAZY);
+ if(!lib)
+ {
+ printf("failed to open library \"%s\" with error: %s\n", i->path().c_str(), dlerror());
+ return;
+ }
+ void *fptr = dlsym(lib, "udm_downloader_module_load");
+ if(!fptr)
+ {
+ printf("failed to find symbol \"udm_downloader_module_load\" in library %s with error %s\n", i->path().c_str(), dlerror());
+ dlclose(lib);
+ return;
+ }
+ void *(*f)(void);
+ f = (void* (*)())fptr;
+ //TODO: aditional sanity checks
+ module_metadata_storage *m = static_cast<module_metadata_storage*>(f());
+ m->load(module_api);
+ metadata_modules.push_back(m);
+ }
+ }
+}
+
+std::string modules_handler::get_self_path()
+{
+ //TODO: dynamic buffer
+ char buf[1024];
+ readlink("/proc/self/exe", buf, 1023);
+ std::string s (buf);
+ return s;
+}
+
+std::string modules_handler::list_modules()
+{
+ std::string buf;
+ buf += "Installed metadata modules:\n";
+ for(auto i = metadata_modules.begin(), end = metadata_modules.end(); i != end; ++i)
+ {
+ buf += "\t";
+ buf += (*i)->get_module_info().name;
+ buf += " (" + (*i)->get_module_info().description + ") ";
+ buf += "v" + (*i)->get_module_info().version;
+ buf += "\n";
+ }
+ buf += "Installed downloader modules:\n";
+ for(auto i = downloader_modules.begin(), end = downloader_modules.end(); i != end; ++i)
+ {
+ buf += "\t";
+ buf += (*i)->get_module_info().name;
+ buf += " (" + (*i)->get_module_info().description + ") ";
+ buf += "v" + (*i)->get_module_info().version;
+ buf += "\n";
+ }
+ return buf;
+}
+
+
+modules_handler::modules_handler()
+{
+ self_path = get_self_path();
+ boost::filesystem::path p(self_path);
+ std::string self_dir = p.parent_path().generic_string();
+ load_metadata_modules(self_dir + "/modules/metadata");
+ load_metadata_modules("~/.share/udm/modules/metadata");
+ load_metadata_modules("/usr/lib/udm/modules/metadata");
+ load_downloader_modules(self_dir + "/modules/downloader");
+ load_downloader_modules("~/.share/udm/modules/downloader");
+ load_downloader_modules("/usr/lib/udm/modules/downloader");
+}
+
+modules_handler::~modules_handler()
+{
+ //dtor
+}