/*
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 .
*/
#include "modules_handler.h"
#include
#include
#include
#include
#include
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(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(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
}