/
MaximU
/
application
Обзор
Документация
Войти
/
MaximU
/
application
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
connectionclient.cpp
341 строка
8 KB
Максим
Отформатированы коментарии Doxygen к функциям/классам в стиле Qt.
03 июл 2026, 22:42
03 июл 2026, 22:42
7a8588b
Код
Авторство
О чём код?
#include "connectionclient.h" extern std::shared_ptr<char[]> acquireInputBuffer(); extern void releaseInputBuffer(std::shared_ptr<char[]> buffer); extern void releaseInputData(std::shared_ptr<char[]> buffer); /*! * \brief Конструктор. * \param id Идентификатор соединения. * \param name Имя соединения. * \param label Метка соединения. * \param device Устройство ввода/вывода. */ ConnectionClient::ConnectionClient(int id, const QString &name, const QString &label, QIODevice *device) : Connection(id, name, label), mDevice(device) { mTimerReconnect.setInterval(1000); QObject::connect(&mTimerReconnect, &QTimer::timeout, this, &ConnectionClient::slot_timer_timeout); if (mDevice != nullptr) { mTimeConnect = QDateTime::currentDateTime(); } } /*! * \brief Деструктор. */ ConnectionClient::~ConnectionClient() { delete mDevice; } /*! * \brief Открывает соединение и осуществляет попытку соединения. */ void ConnectionClient::open() { mState = StateConnecting; mAttempts ++; connect(); } /*! * \brief Закрывает соединение. */ void ConnectionClient::close() { if (mState == StateConnecting) { mTimerReconnect.stop(); mAttempts = 0; mState = StateUnconnected; } if (mState == StateConnected) { mState = StateDisconnecting; disconnect(); } } /*! * \brief Возвращает указатель на устройство ввода/вывода. * \return Указатель на устройство ввода/вывода. */ QIODevice *ConnectionClient::device() { return mDevice; } /*! * \brief Устанавливает значение признака восстановления связи после разрыва. * \param reconnect Значение признака восстановления связи после разрыва. */ void ConnectionClient::setReconnect(bool reconnect) { mReconnect = reconnect; } /*! * \brief Возвращает количество произведенных попыток подключения. * \return Количество произведенных попыток подключения. */ int ConnectionClient::attempts() { return mAttempts; } /*! * \brief Возвращает идентификатор состояния соединения. * \return Идентификатор состояния соединения. */ ConnectionClient::States ConnectionClient::state() { return mState; } /*! * \brief Возвращает принак подключения. * \return Признак подключения. */ bool ConnectionClient::isConnected() { return state() == StateConnected; } /*! * \brief Возвращает принак выполнения чтения. * \return Признак выполнения чтения. */ bool ConnectionClient::isReading() { return mReading; } /*! * \brief Возвращает принак выполнения записи. * \return Признак выполнения записи. */ bool ConnectionClient::isWriting() { return mWriting; } /*! * \brief Возвращает описание идентификатора состояния соединения. * \param state Идентификатор состояния соединения. * \return Описание идентификатора состояния соединения. */ QString ConnectionClient::toString(ConnectionClient::States state) { switch (state) { case StateUnconnected: return QObject::tr("Нет"); case StateConnecting: return QObject::tr("Подключение..."); case StateConnected: return QObject::tr("Есть"); case StateDisconnecting: return QObject::tr("Отключение..."); default: break; } return QString(); } /*! * \brief Производит чтение. * \param data Массив информации. * \param maxSize Длина массива. */ void ConnectionClient::read(char *data, int maxSize) { mDevice->read(data, maxSize); } /*! * \brief Производит выдачу. * \param data Массив информации. * \param length Длина массива. */ void ConnectionClient::write(const char *data, int length) { if (mState == StateConnected) { mWriting = true; emit beginWritePortion(this); try { for (int written = 0; written < length; ) { int w = mDevice->write(data + written, length - written); if (w > 0) { written += w; } if (mState != StateConnected) { break; } } } catch (...) { close(); // При возникновении ошибки соединение закрывается. return; } mWriting = false; mTimeSend = QDateTime::currentDateTime(); emit endWritePortion(this); } } /*! * \brief Возвращает время соединения. * \return Время соединения. */ QDateTime ConnectionClient::timeConnect() { return mTimeConnect; } /*! * \brief Возвращает время разрыва соединения. * \return Время разрыва соединения. */ QDateTime ConnectionClient::timeDisconnect() { return mTimeDisconnect; } /*! * \brief Возвращает время приема. * \return Время приема. */ QDateTime ConnectionClient::timeReceive() { return mTimeReceive; } /*! * \brief Возвращает время выдачи. * \return Время выдачи. */ QDateTime ConnectionClient::timeSend() { return mTimeSend; } /*! * \brief Выполняет повторную попытку подключения. */ void ConnectionClient::repeat() { mState = StateConnecting; emit connecting(this); mTimerReconnect.start(); } /*! * \brief Запрашивает буфер приема входной информации из пула. */ void ConnectionClient::acquireBuffer() { mBuffer = acquireInputBuffer(); } /*! * \brief Помещает заполненный буфер приема входной информации в очередь на ожидание. */ void ConnectionClient::releaseData() { releaseInputData(mBuffer); mBuffer = nullptr; } /*! * \brief Возвращает заполненный буфер приема входной информации в пул массивов входной информации. */ void ConnectionClient::releaseBuffer() { releaseInputBuffer(mBuffer); mBuffer = nullptr; } /*! * \brief Выполняется по истечении таймаута. */ void ConnectionClient::slot_timer_timeout() { mTimerReconnect.stop(); if (mState != StateConnected) { mAttempts ++; connect(); } } /*! * \brief Выполняется при подключении устройства. */ void ConnectionClient::slot_device_connected() { mState = StateConnected; mTimeConnect = QDateTime::currentDateTime(); emit connected(this); } /*! * \brief Выполняется при отключении устройства. */ void ConnectionClient::slot_device_disconnected() { mReading = false; mWriting = false; mBytesRead = 0; //// mState = StateUnconnected; mTimeDisconnect = QDateTime::currentDateTime(); mAttempts = 0; if (mReconnect) { repeat(); } emit disconnected(this); // NOTE: В слоте disconnected this может быть удален! } /*! * \brief Выполняется при появлении данных в устройстве. */ void ConnectionClient::slot_device_readyRead() { readDevice(); }