Files
BCIgui/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingClient.cpp
T
2021-10-14 13:47:35 +02:00

173 lines
4.6 KiB
C++

#include "ovCMessagingClient.h"
#include "ovCMessagingImpl.hpp"
namespace Communication {
MessagingClient::MessagingClient() : CMessaging(), m_Client(Socket::createConnectionClient()) {}
MessagingClient::~MessagingClient()
{
this->close();
m_Client->release();
}
bool MessagingClient::connect(const std::string& uri, const size_t port)
{
this->reset();
if (!m_Client->connect(uri.c_str(), port))
{
this->setLastError(Socket_FailedToConnect);
return false;
}
this->setConnection(m_Client);
// Once the connection is done, the client push an authentication message to the server
if (!this->pushAuthentication(impl->m_ConnectionID))
{
// Error set in the function
const ELibraryError error = this->getLastError();
this->close();
this->setLastError(error);
return false;
}
if (!this->startSyncing())
{
this->close();
return false;
}
// To work, the client need to receive box information message. So we wait to receive the box information message.
// A timeout of 10 seconds is set.
const std::chrono::time_point<std::chrono::system_clock> startClock = std::chrono::system_clock::now();
uint64_t packetId;
while (std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - startClock).count() < 10)
{
if (this->popBoxDescriptions(packetId, impl->m_BoxDesc))
{
m_BoxDescriptionReceived = true;
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
if (!m_BoxDescriptionReceived)
{
this->close();
this->setLastError(BoxDescriptionNotReceived);
return false;
}
return true;
}
bool MessagingClient::close() const
{
this->pushMessage(EndMessage());
this->stopSyncing();
if (m_Client != nullptr)
{
if (!m_Client->close())
{
this->setLastError(Socket_FailedToCloseConnection);
return false;
}
}
return true;
}
size_t MessagingClient::getParameterCount() const
{
if (!m_BoxDescriptionReceived) { return 0; }
return impl->m_BoxDesc.getParameters()->size();
}
size_t MessagingClient::getInputCount() const
{
if (!m_BoxDescriptionReceived) { return 0; }
return impl->m_BoxDesc.getInputs()->size();
}
size_t MessagingClient::getOutputCount() const
{
if (!m_BoxDescriptionReceived) { return 0; }
return impl->m_BoxDesc.getOutputs()->size();
}
bool MessagingClient::getParameter(const size_t i, uint64_t& id, uint64_t& type, std::string& name, std::string& value) const
{
if (!m_BoxDescriptionReceived) { return false; }
const std::vector<Parameter>* parameters = impl->m_BoxDesc.getParameters();
if (parameters->size() <= i) { return false; }
id = parameters->at(i).getId();
type = parameters->at(i).getType();
name = parameters->at(i).getName();
value = parameters->at(i).getValue();
return true;
}
bool MessagingClient::getInput(const size_t i, uint64_t& id, uint64_t& type, std::string& name) const
{
if (!m_BoxDescriptionReceived) { return false; }
const std::vector<InputOutput>* inputs = impl->m_BoxDesc.getInputs();
if (inputs->size() <= i) { return false; }
id = inputs->at(i).getId();
type = inputs->at(i).getType();
name = inputs->at(i).getName();
return true;
}
bool MessagingClient::getOutput(const size_t i, uint64_t& id, uint64_t& type, std::string& name) const
{
if (!m_BoxDescriptionReceived)
{
const_cast<MessagingClient*>(this)->setLastError(BoxDescriptionNotReceived);
return false;
}
const std::vector<InputOutput>* outputs = impl->m_BoxDesc.getOutputs();
if (outputs->size() <= i) { return false; }
id = outputs->at(i).getId();
type = outputs->at(i).getType();
name = outputs->at(i).getName();
return true;
}
bool MessagingClient::popError(uint64_t& packetId, EError& type, uint64_t& guiltyId) { return CMessaging::popError(packetId, type, guiltyId); }
bool MessagingClient::popEBML(uint64_t& packetId, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr<const std::vector<uint8_t>>& ebml)
{
return CMessaging::popEBML(packetId, index, startTime, endTime, ebml);
}
bool MessagingClient::pushAuthentication(const std::string& connectionID) const { return this->pushMessage(AuthenticationMessage(connectionID)); }
bool MessagingClient::pushLog(const ELogLevel logLevel, const std::string& log) const { return this->pushMessage(LogMessage(logLevel, log)); }
bool MessagingClient::pushEBML(const size_t index, const uint64_t startTime, const uint64_t endTime,
const std::shared_ptr<const std::vector<uint8_t>>& ebml) const
{
return this->pushMessage(EBMLMessage(index, startTime, endTime, ebml));
}
bool MessagingClient::pushSync() const { return this->pushMessage(SyncMessage()); }
bool MessagingClient::waitForSyncMessage() { return CMessaging::waitForSyncMessage(); }
} // namespace Communication