Encapsulate protocol_t
This commit is contained in:
parent
efabc7a40d
commit
3756620213
6 changed files with 91 additions and 26 deletions
|
@ -40,11 +40,12 @@ void main(int argc, char *argv[]) {
|
|||
std::exit(1);
|
||||
}
|
||||
|
||||
std::shared_ptr<const protocol_t> proto = load_protocol(argv[1]);
|
||||
context_t mmss;
|
||||
|
||||
std::shared_ptr<const protocol_t> proto = protocol_t::load(&mmss, argv[1]);
|
||||
if (!proto)
|
||||
std::exit(1);
|
||||
|
||||
context_t mmss;
|
||||
config_t conf = {};
|
||||
|
||||
//read_config(&mmss, &conf, "babel_test.mmss");
|
||||
|
|
|
@ -61,8 +61,6 @@ public:
|
|||
};
|
||||
|
||||
|
||||
std::shared_ptr<const protocol_t> load_protocol(const char *module);
|
||||
|
||||
bool read_config(context_t *mmss, config_t *conf, const char *filename);
|
||||
|
||||
void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<network_t> &net, const std::string &name, const gmrf_addr_t *address);
|
||||
|
|
|
@ -26,8 +26,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "types.hpp"
|
||||
#include "iface.hpp"
|
||||
#include "protocol.hpp"
|
||||
|
||||
#include <list>
|
||||
#include <memory>
|
||||
|
|
|
@ -24,43 +24,36 @@
|
|||
*/
|
||||
|
||||
|
||||
#include "protocol.hpp"
|
||||
#include "mmss.hpp"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <cstdio>
|
||||
|
||||
|
||||
namespace MMSS {
|
||||
|
||||
class dlcloser {
|
||||
private:
|
||||
void *handle;
|
||||
protocol_t::~protocol_t() {
|
||||
::dlclose(handle);
|
||||
}
|
||||
|
||||
public:
|
||||
dlcloser(void *handle0) : handle(handle0) {}
|
||||
void operator()(const protocol_t *ptr) const {
|
||||
::dlclose(handle);
|
||||
}
|
||||
};
|
||||
|
||||
std::shared_ptr<const protocol_t> load_protocol(const char *module) {
|
||||
void *handle = ::dlopen(module, RTLD_NOW);
|
||||
std::shared_ptr<const protocol_t> protocol_t::load(context_t *mmss, const std::string &module) {
|
||||
void *handle = ::dlopen(module.c_str(), RTLD_NOW);
|
||||
if (!handle) {
|
||||
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
|
||||
mmss->logf(LOG_ERR, "unable to load protocol from `%s': %s", module.c_str(), dlerror());
|
||||
return std::shared_ptr<const protocol_t>();
|
||||
}
|
||||
|
||||
::dlerror();
|
||||
const protocol_t *proto = reinterpret_cast<const protocol_t*>(::dlsym(handle, "mmss_protocol_info"));
|
||||
const mmss_protocol_t *proto = reinterpret_cast<const mmss_protocol_t*>(::dlsym(handle, "mmss_protocol_info"));
|
||||
if (!proto) {
|
||||
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
|
||||
mmss->logf(LOG_ERR, "unable to load protocol from `%s': %s", module.c_str(), dlerror());
|
||||
::dlclose(handle);
|
||||
return std::shared_ptr<const protocol_t>();
|
||||
}
|
||||
|
||||
std::fprintf(stderr, "loaded protocol `%s' version %s\n", proto->get_name(), proto->get_version());
|
||||
mmss->logf(LOG_INFO, "loaded protocol `%s' version %s", proto->get_name(), proto->get_version());
|
||||
|
||||
return std::shared_ptr<const protocol_t>(proto, dlcloser(handle));
|
||||
return std::shared_ptr<const protocol_t>(new protocol_t(handle, proto));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
75
mmss/protocol.hpp
Normal file
75
mmss/protocol.hpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "types.hpp"
|
||||
|
||||
extern "C" {
|
||||
|
||||
#include <mmss/protocol.h>
|
||||
|
||||
}
|
||||
|
||||
#include <memory>
|
||||
|
||||
|
||||
namespace MMSS {
|
||||
|
||||
class protocol_t {
|
||||
private:
|
||||
void *handle;
|
||||
const mmss_protocol_t *proto;
|
||||
|
||||
protocol_t(void *handle0, const mmss_protocol_t *proto0) : handle(handle0), proto(proto0) {}
|
||||
|
||||
public:
|
||||
~protocol_t();
|
||||
|
||||
const char* get_name() const {
|
||||
return proto->get_name();
|
||||
}
|
||||
|
||||
const char* get_version() const {
|
||||
return proto->get_version();
|
||||
}
|
||||
|
||||
gmrf_context_t* init(gmrf_t *gmrf) const {
|
||||
return proto->init(gmrf);
|
||||
}
|
||||
|
||||
void add_iface(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface) const {
|
||||
return proto->add_iface(gmrf, ctx, iface);
|
||||
}
|
||||
|
||||
void handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len) const {
|
||||
return proto->handle_packet(gmrf, ctx, iface, source, data, len);
|
||||
}
|
||||
|
||||
static std::shared_ptr<const protocol_t> load(context_t *mmss, const std::string &module);
|
||||
};
|
||||
|
||||
}
|
|
@ -32,7 +32,6 @@
|
|||
|
||||
extern "C" {
|
||||
|
||||
#include <mmss/protocol.h>
|
||||
#include <gmrf/gmrf.h>
|
||||
|
||||
}
|
||||
|
@ -50,8 +49,7 @@ class network_t;
|
|||
class node_t;
|
||||
class now_t;
|
||||
class packet_t;
|
||||
class protocol_t;
|
||||
class scheduled_t;
|
||||
|
||||
typedef ::mmss_protocol_t protocol_t;
|
||||
|
||||
}
|
||||
|
|
Reference in a new issue