Files
pip/libs/main/cloud/picloudtcp.h
2026-03-12 14:46:57 +03:00

161 lines
7.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! \~\file picloudtcp.h
//! \~\ingroup Cloud
//! \~\brief
//! \~english Low-level TCP framing helpers for PICloud
//! \~russian Низкоуровневые помощники TCP-кадрирования для PICloud
//!
/*
PIP - Platform Independent Primitives
PICloud TCP transport
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PICLOUDTCP_H
#define PICLOUDTCP_H
#include "pimutex.h"
#include "pip_cloud_export.h"
#include "pistring.h"
class PIStreamPacker;
//! \~\ingroup Cloud
//! \~english Namespace for low-level PICloud transport helpers.
//! \~russian Пространство имен для низкоуровневых транспортных помощников PICloud.
namespace PICloud {
//! \~\ingroup Cloud
//! \~\brief
//! \~english Builds and parses PICloud frames on top of %PIStreamPacker.
//! \~russian Формирует и разбирает кадры PICloud поверх %PIStreamPacker.
class PIP_CLOUD_EXPORT TCP {
public:
//! \~english Supported PICloud frame versions.
//! \~russian Поддерживаемые версии кадров PICloud.
enum Version {
Version_1 = 1 /** \~english First protocol version \~russian Первая версия протокола */,
Version_2 = 2 /** \~english Current protocol version \~russian Текущая версия протокола */
};
//! \~english Logical destination role of a PICloud frame.
//! \~russian Логическая роль получателя кадра PICloud.
enum Role {
InvalidRole = 0 /** \~english Invalid or unknown role \~russian Некорректная или неизвестная роль */,
Server = 1 /** \~english Frame for a logical server \~russian Кадр для логического сервера */,
Client = 2 /** \~english Frame for a logical client \~russian Кадр для логического клиента */
};
//! \~english Kind of PICloud frame payload.
//! \~russian Вид полезной нагрузки кадра PICloud.
enum Type {
InvalidType = 0 /** \~english Invalid or unknown frame \~russian Некорректный или неизвестный кадр */,
Connect = 1 /** \~english Connect or registration frame \~russian Кадр подключения или регистрации */,
Disconnect = 2 /** \~english Disconnect notification frame \~russian Кадр уведомления об отключении */,
Data = 3 /** \~english Payload data frame \~russian Кадр с полезными данными */,
Ping = 4 /** \~english Keepalive frame \~russian Кадр поддержания соединения */
};
//! \~english Constructs a PICloud frame helper bound to packer "s".
//! \~russian Создает помощник кадров PICloud, связанный с упаковщиком "s".
TCP(PIStreamPacker * s);
//! \~english Sets the logical role written into outgoing frames.
//! \~russian Устанавливает логическую роль, записываемую в исходящие кадры.
void setRole(Role r);
//! \~english Returns the logical role of this helper.
//! \~russian Возвращает логическую роль этого помощника.
Role role() const { return (Role)header.role; }
//! \~english Sets the logical server name used by connect and keepalive frames.
//! \~russian Устанавливает логическое имя сервера, используемое кадрами подключения и поддержания соединения.
void setServerName(const PIString & server_name_);
//! \~english Returns the configured logical server name.
//! \~russian Возвращает настроенное логическое имя сервера.
PIString serverName() const;
//! \~english Sends the initial connect frame for the current server name.
//! \~russian Отправляет начальный кадр подключения для текущего имени сервера.
void sendStart();
//! \~english Sends a connect frame for logical client "client_id".
//! \~russian Отправляет кадр подключения для логического клиента "client_id".
void sendConnected(uint client_id);
//! \~english Sends a disconnect frame for logical client "client_id".
//! \~russian Отправляет кадр отключения для логического клиента "client_id".
void sendDisconnected(uint client_id);
//! \~english Sends a payload frame for the current logical role.
//! \~russian Отправляет кадр с полезными данными для текущей логической роли.
int sendData(const PIByteArray & data);
//! \~english Sends a payload frame tagged with logical client "client_id".
//! \~russian Отправляет кадр с полезными данными, помеченный логическим клиентом "client_id".
int sendData(const PIByteArray & data, uint client_id);
//! \~english Sends a keepalive frame.
//! \~russian Отправляет кадр поддержания соединения.
void sendPing();
//! \~english Parses frame header and returns its type and destination role.
//! \~russian Разбирает заголовок кадра и возвращает его тип и роль получателя.
PIPair<PICloud::TCP::Type, PICloud::TCP::Role> parseHeader(PIByteArray & ba);
//! \~english Returns whether current role uses direct payload parsing.
//! \~russian Возвращает, использует ли текущая роль прямой разбор полезной нагрузки.
bool canParseData(PIByteArray & ba);
//! \~english Extracts logical client identifier and payload from a server-side data frame.
//! \~russian Извлекает идентификатор логического клиента и полезную нагрузку из серверного кадра данных.
PIPair<uint, PIByteArray> parseDataServer(PIByteArray & ba);
//! \~english Validates and returns raw connect payload used for server identity exchange.
//! \~russian Проверяет и возвращает сырой payload подключения, используемый при обмене идентичностью сервера.
PIByteArray parseConnect_d(PIByteArray & ba);
//! \~english Extracts logical client identifier from a connect frame.
//! \~russian Извлекает идентификатор логического клиента из кадра подключения.
uint parseConnect(PIByteArray & ba);
//! \~english Extracts logical client identifier from a disconnect frame.
//! \~russian Извлекает идентификатор логического клиента из кадра отключения.
uint parseDisconnect(PIByteArray & ba);
private:
struct Header {
Header();
uchar version; // PICloud::Version
uchar type; // PICloud::Type
uchar role; // PICloud::Role
};
Header header;
PIByteArray suuid;
PIString server_name;
PIStreamPacker * streampacker;
PIMutex mutex_send;
};
} // namespace PICloud
#endif // PICLOUDTCP_H