123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #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
|