
2 changed files with 135 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||||
|
#include "PityTransport.hh" |
||||
|
#include "iostream" |
||||
|
#include "../../../src/std_utils.hh" |
||||
|
#include <random> |
||||
|
#include <fstream> |
||||
|
#include <memory> |
||||
|
#include <map> |
||||
|
|
||||
|
namespace pEp { |
||||
|
namespace PityTest11 { |
||||
|
bool PityTransport::debug_log_enabled = false; |
||||
|
|
||||
|
PityTransport::PityTransport(const std::string& inboxDir, Endpoints& endpoints) : |
||||
|
_inboxDir{ inboxDir }, _endpoints{ endpoints } |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void PityTransport::sendMsg(const std::string nodename, const std::string& msg) const |
||||
|
{ |
||||
|
pEpLogClass("Address: " + nodename + " msg: " + msg); |
||||
|
bool found = false; |
||||
|
std::string dir; |
||||
|
try { |
||||
|
dir = _endpoints.at(nodename); |
||||
|
} catch (std::out_of_range&) { |
||||
|
throw std::runtime_error("no such nodename: " + nodename); |
||||
|
} |
||||
|
Utils::dir_ensure(dir); |
||||
|
std::stringstream filename; |
||||
|
// collision detect
|
||||
|
do { |
||||
|
filename << dir << Utils::random_string(97, 122, 16) << ".pitymsg"; |
||||
|
} while (Utils::path_exists(filename.str())); |
||||
|
// create
|
||||
|
std::ofstream msgfile = Utils::file_create(filename.str()); |
||||
|
// write
|
||||
|
msgfile << msg; |
||||
|
} |
||||
|
|
||||
|
bool PityTransport::hasMsg() const |
||||
|
{ |
||||
|
bool ret = false; |
||||
|
pEpLogClass("called"); |
||||
|
Utils::dir_ensure(_inboxDir); |
||||
|
auto msg_filenames = Utils::dir_list_files(_inboxDir); |
||||
|
ret = msg_filenames.size() > 0; |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
// Non-blocking
|
||||
|
// throws underflow_error if inbox empty
|
||||
|
std::string PityTransport::pollMsg() const |
||||
|
{ |
||||
|
pEpLogClass("called"); |
||||
|
std::string ret; |
||||
|
Utils::dir_ensure(_inboxDir); |
||||
|
auto msg_filenames = Utils::dir_list_files(_inboxDir); |
||||
|
if (!msg_filenames.empty()) { |
||||
|
std::string msg_filename = msg_filenames.at(0); |
||||
|
std::string msg_path = _inboxDir + "/" + msg_filename; |
||||
|
pEpLogClass("Reading file: " + msg_filename); |
||||
|
ret = Utils::file_read(msg_path); |
||||
|
Utils::path_delete(msg_path); |
||||
|
} else { |
||||
|
throw std::underflow_error("inbox empty: " + _inboxDir); |
||||
|
} |
||||
|
|
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
std::string PityTransport::receiveMsg(int timeout_msec) const |
||||
|
{ |
||||
|
pEpLogClass("called"); |
||||
|
std::string ret; |
||||
|
bool retry = false; |
||||
|
do { |
||||
|
try { |
||||
|
ret = pollMsg(); |
||||
|
retry = false; |
||||
|
} catch (const std::underflow_error&) { |
||||
|
pEpLogClass("polling again in [ms]: " + std::to_string(timeout_msec) + "..."); |
||||
|
Utils::sleep_millis(timeout_msec); |
||||
|
retry = true; |
||||
|
} |
||||
|
} while (retry); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
} // namespace PityTest11
|
||||
|
} // namespace pEp
|
@ -0,0 +1,45 @@ |
|||||
|
// This file is under GNU General Public License 3.0
|
||||
|
// see LICENSE.txt
|
||||
|
|
||||
|
#ifndef PITYTEST_PITYTRANSPORT_HH |
||||
|
#define PITYTEST_PITYTRANSPORT_HH |
||||
|
|
||||
|
#include "../../../src/pEpLog.hh" |
||||
|
#include <vector> |
||||
|
#include <memory> |
||||
|
#include <unordered_map> |
||||
|
|
||||
|
namespace pEp { |
||||
|
namespace PityTest11 { |
||||
|
// Address - Dir
|
||||
|
using Endpoints = std::unordered_map<std::string, std::string>; |
||||
|
|
||||
|
class PityTransport { |
||||
|
public: |
||||
|
// Constructors
|
||||
|
PityTransport() = delete; |
||||
|
PityTransport(const std::string& inboxDir, Endpoints& endpoints); |
||||
|
|
||||
|
// Getters
|
||||
|
//Transport
|
||||
|
bool hasMsg() const; |
||||
|
void sendMsg(const std::string nodename, const std::string& msg) const; |
||||
|
std::string pollMsg() const; |
||||
|
std::string receiveMsg(int timeout_msec = 100) const; |
||||
|
|
||||
|
//internal logging
|
||||
|
static bool debug_log_enabled; |
||||
|
Adapter::pEpLog::pEpLogger logger_debug{ "PityModel", debug_log_enabled }; |
||||
|
|
||||
|
private: |
||||
|
std::string _inboxDir; |
||||
|
Endpoints& _endpoints; |
||||
|
|
||||
|
//internal logging
|
||||
|
Adapter::pEpLog::pEpLogger& m4gic_logger_n4me = logger_debug; |
||||
|
}; |
||||
|
}; // namespace PityTest11
|
||||
|
|
||||
|
}; // namespace pEp
|
||||
|
|
||||
|
#endif // PITYTEST_PITYTRANSPORT_HH
|
Loading…
Reference in new issue