/*! \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 . */ #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 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 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