/*
- Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
-#include "nanomsg.h"
+
#include "dcpomatic_log.h"
#include "exceptions.h"
+#include "nanomsg.h"
#include <nanomsg/nn.h>
#include <nanomsg/pair.h>
-#include <stdexcept>
#include <cerrno>
+#include <stdexcept>
+
-using std::string;
using std::runtime_error;
+using std::string;
using boost::optional;
+
#define NANOMSG_URL "ipc:///tmp/dcpomatic.ipc"
+
Nanomsg::Nanomsg (bool server)
{
_socket = nn_socket (AF_SP, NN_PAIR);
throw runtime_error("Could not set up nanomsg socket");
}
if (server) {
- if (nn_bind(_socket, NANOMSG_URL) < 0) {
+ if ((_endpoint = nn_bind(_socket, NANOMSG_URL)) < 0) {
throw runtime_error(String::compose("Could not bind nanomsg socket (%1)", errno));
}
} else {
- if (nn_connect(_socket, NANOMSG_URL) < 0) {
+ if ((_endpoint = nn_connect(_socket, NANOMSG_URL)) < 0) {
throw runtime_error(String::compose("Could not connect nanomsg socket (%1)", errno));
}
}
}
+
+Nanomsg::~Nanomsg ()
+{
+ nn_shutdown (_socket, _endpoint);
+ nn_close (_socket);
+}
+
+
bool
Nanomsg::send (string s, int timeout)
{
return true;
}
+
optional<string>
Nanomsg::get_from_pending ()
{
if (_pending.empty()) {
- return optional<string>();
+ return {};
}
- string const l = _pending.back();
+ auto const l = _pending.back();
_pending.pop_back();
return l;
}
+
void
Nanomsg::recv_and_parse (int flags)
{
return;
}
+ LOG_DISK_NC("nn_recv failed");
throw CommunicationFailedError ();
}
nn_freemsg (buf);
}
+
optional<string>
Nanomsg::receive (int timeout)
{
nn_setsockopt (_socket, NN_SOL_SOCKET, NN_RCVTIMEO, &timeout, sizeof(int));
}
- optional<string> l = get_from_pending ();
+ auto l = get_from_pending ();
if (l) {
return *l;
}
recv_and_parse (timeout ? 0 : NN_DONTWAIT);
return get_from_pending ();
- if (!l) {
- throw CommunicationFailedError ();
- }
-
- return *l;
}