more ai generated doc with human review
This commit is contained in:
@@ -29,24 +29,39 @@
|
||||
#include "picrc.h"
|
||||
#include "pidiagnostics.h"
|
||||
|
||||
//! \~english Base class for reliable send and receive data in fixed packets with error correction, pause and resume
|
||||
//! \~russian Базовый класс для надежного обмена данными с помощью фиксированных пакетов с коррекцией ошибок и паузой
|
||||
class PIP_EXPORT PIBaseTransfer: public PIObject {
|
||||
PIOBJECT_SUBCLASS(PIBaseTransfer, PIObject);
|
||||
|
||||
public:
|
||||
//! \~english Constructs empty transfer
|
||||
//! \~russian Создает пустой transfer
|
||||
PIBaseTransfer();
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
~PIBaseTransfer();
|
||||
|
||||
#pragma pack(push, 1)
|
||||
//! \~english Packet header structure
|
||||
//! \~russian Структура заголовка пакета
|
||||
struct PIP_EXPORT PacketHeader {
|
||||
uint sig;
|
||||
int type; // PacketType
|
||||
int session_id;
|
||||
uint id;
|
||||
uint crc;
|
||||
//! \~english Check if signature is valid
|
||||
//! \~russian Проверка валидности подписи
|
||||
bool check_sig() { return (sig == signature); }
|
||||
};
|
||||
|
||||
//! \~english Part information structure
|
||||
//! \~russian Структура информации о части
|
||||
struct PIP_EXPORT Part {
|
||||
//! \~english Constructor
|
||||
//! \~russian Конструктор
|
||||
Part(uint id_ = 0, ullong size_ = 0, ullong start_ = 0): id(id_), size(size_), start(start_) {}
|
||||
uint id;
|
||||
ullong size;
|
||||
@@ -54,29 +69,76 @@ public:
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
//! \~english Stop sending data
|
||||
//! \~russian Остановить отправку данных
|
||||
void stopSend();
|
||||
|
||||
//! \~english Stop receiving data
|
||||
//! \~russian Остановить прием данных
|
||||
void stopReceive();
|
||||
|
||||
//! \~english Check if currently sending
|
||||
//! \~russian Проверка, идет ли отправка
|
||||
bool isSending() const { return is_sending; }
|
||||
|
||||
//! \~english Check if currently receiving
|
||||
//! \~russian Проверка, идет ли прием
|
||||
bool isReceiving() const { return is_receiving; }
|
||||
|
||||
//! \~english Check if paused
|
||||
//! \~russian Проверка, на паузе ли
|
||||
bool isPause() const { return is_pause; }
|
||||
|
||||
//! \~english Set pause state
|
||||
//! \~russian Установить состояние паузы
|
||||
void setPause(bool pause_);
|
||||
|
||||
//! \~english Set packet size
|
||||
//! \~russian Установить размер пакета
|
||||
void setPacketSize(int size) { packet_size = size; }
|
||||
|
||||
//! \~english Get packet size
|
||||
//! \~russian Получить размер пакета
|
||||
int packetSize() const { return packet_size; }
|
||||
|
||||
//! \~english Set timeout in seconds
|
||||
//! \~russian Установить таймаут в секундах
|
||||
void setTimeout(double sec);
|
||||
|
||||
//! \~english Get timeout in seconds
|
||||
//! \~russian Получить таймаут в секундах
|
||||
double timeout() const { return timeout_; }
|
||||
|
||||
//! \~english Enable/disable CRC check
|
||||
//! \~russian Включить/выключить проверку CRC
|
||||
void setCRCEnabled(bool en = true) { crc_enabled = en; }
|
||||
|
||||
//! \~english Check if CRC is enabled
|
||||
//! \~russian Проверка, включен ли CRC
|
||||
bool isCRCEnabled() const { return crc_enabled; }
|
||||
|
||||
//! \~english Get state as string
|
||||
//! \~russian Получить состояние в виде строки
|
||||
PIString stateString() const { return state_string; }
|
||||
|
||||
//! \~english Get packet map as string
|
||||
//! \~russian Получить карту пакетов в виде строки
|
||||
PIString packetMap() const { return pm_string; }
|
||||
|
||||
//! \~english Get total bytes count
|
||||
//! \~russian Получить общее количество байт
|
||||
llong bytesAll() const { return bytes_all; }
|
||||
|
||||
//! \~english Get current bytes count
|
||||
//! \~russian Получить текущее количество байт
|
||||
llong bytesCur() const { return bytes_cur; }
|
||||
|
||||
//! \~english Get diagnostics object
|
||||
//! \~russian Получить объект диагностики
|
||||
const PIDiagnostics & diagnostic() { return diag; }
|
||||
|
||||
//! \~english Get packet signature
|
||||
//! \~russian Получить подпись пакета
|
||||
static uint packetSignature() { return signature; }
|
||||
|
||||
EVENT_HANDLER1(void, received, PIByteArray, data);
|
||||
|
||||
@@ -31,13 +31,16 @@
|
||||
#include "pip_io_utils_export.h"
|
||||
|
||||
|
||||
//! \~english Broadcast for all interfaces, including loopback
|
||||
//! \~russian Широкое вещание на все интерфейсы, включая loopback
|
||||
class PIP_IO_UTILS_EXPORT PIBroadcast
|
||||
: public PIThread
|
||||
, public PIEthUtilBase {
|
||||
PIOBJECT_SUBCLASS(PIBroadcast, PIThread);
|
||||
|
||||
public:
|
||||
//! %PIBroadcast channels, can be used independently
|
||||
//! \~english %PIBroadcast channels, can be used independently
|
||||
//! \~russian Каналы %PIBroadcast, могут использоваться независимо
|
||||
enum Channel {
|
||||
Multicast /** Use multicast addresses */ = 0x01,
|
||||
Broadcast /** Use broadcast addresses */ = 0x02,
|
||||
@@ -45,75 +48,97 @@ public:
|
||||
All /** Use all channels */ = 0xFFFF,
|
||||
};
|
||||
|
||||
//! \~english Channels flags type
|
||||
//! \~russian Тип флагов каналов
|
||||
typedef PIFlags<Channel> Channels;
|
||||
|
||||
/** Contructs %PIBroadcast, if \"send_only\" not set
|
||||
* all PIEthernets will be binded to receive data
|
||||
* */
|
||||
//! \~english Constructs %PIBroadcast. If "send_only" not set, all PIEthernets will be binded to receive data
|
||||
//! \~russian Создает %PIBroadcast. Если "send_only" не установлен, все PIEthernets будут привязаны для приема данных
|
||||
PIBroadcast(bool send_only = false);
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
~PIBroadcast();
|
||||
|
||||
//! Set channels to \"ch\" and queue to reinit
|
||||
//! \~english Set channels to "ch" and queue to reinit
|
||||
//! \~russian Установить каналы в "ch" и очередь на реинициализацию
|
||||
void setChannels(Channels ch);
|
||||
|
||||
//! Returns channels
|
||||
//! \~english Returns channels
|
||||
//! \~russian Возвращает каналы
|
||||
Channels channels() const { return _channels; }
|
||||
|
||||
//! Returns if is send_only
|
||||
//! \~english Returns if is send_only
|
||||
//! \~russian Возвращает, является ли отправка только
|
||||
bool isSendOnly() const { return _send_only; }
|
||||
|
||||
|
||||
//! Set multicast IP to \"mg\" and queue to reinit
|
||||
//! \~english Set multicast IP to "mg" and queue to reinit
|
||||
//! \~russian Установить multicast IP в "mg" и очередь на реинициализацию
|
||||
void setMulticastGroup(const PIString & mg);
|
||||
|
||||
//! Returns multicast IP
|
||||
//! \~english Returns multicast IP
|
||||
//! \~russian Возвращает multicast IP
|
||||
PIString multicastGroup() const { return mcast_address.ipString(); }
|
||||
|
||||
//! Set multicast port to \"port\" and queue to reinit
|
||||
//! \~english Set multicast port to "port" and queue to reinit
|
||||
//! \~russian Установить multicast порт в "port" и очередь на реинициализацию
|
||||
void setMulticastPort(ushort port);
|
||||
|
||||
//! Returns multicast port
|
||||
//! \~english Returns multicast port
|
||||
//! \~russian Возвращает multicast порт
|
||||
ushort multicastPort() const { return mcast_address.port(); }
|
||||
|
||||
//! Set multicast address to \"addr\" and queue to reinit
|
||||
//! \~english Set multicast address to "addr" and queue to reinit
|
||||
//! \~russian Установить multicast адрес в "addr" и очередь на реинициализацию
|
||||
void setMulticastAddress(const PINetworkAddress & addr);
|
||||
|
||||
//! Returns multicast address
|
||||
//! \~english Returns multicast address
|
||||
//! \~russian Возвращает multicast адрес
|
||||
PINetworkAddress multicastAddress() const { return mcast_address; }
|
||||
|
||||
|
||||
//! Set broadcast port to \"port\" and queue to reinit
|
||||
//! \~english Set broadcast port to "port" and queue to reinit
|
||||
//! \~russian Установить broadcast порт в "port" и очередь на реинициализацию
|
||||
void setBroadcastPort(ushort port);
|
||||
|
||||
//! Returns broadcast port
|
||||
//! \~english Returns broadcast port
|
||||
//! \~russian Возвращает broadcast порт
|
||||
ushort broadcastPort() { return bcast_port; }
|
||||
|
||||
|
||||
//! Set loopback start port to \"port\" and queue to reinit
|
||||
//! \~english Set loopback start port to "port" and queue to reinit
|
||||
//! \~russian Установить начальный loopback порт в "port" и очередь на реинициализацию
|
||||
void setLoopbackPort(ushort port);
|
||||
|
||||
//! Returns loopback start port
|
||||
//! \~english Returns loopback start port
|
||||
//! \~russian Возвращает начальный loopback порт
|
||||
ushort loopbackPort() { return lo_port; }
|
||||
|
||||
//! Set loopback ports count to \"count\" and queue to reinit
|
||||
//! \~english Set loopback ports count to "count" and queue to reinit
|
||||
//! \~russian Установить количество loopback портов в "count" и очередь на реинициализацию
|
||||
void setLoopbackPortsCount(int count);
|
||||
|
||||
//! Returns loopback ports count
|
||||
//! \~english Returns loopback ports count
|
||||
//! \~russian Возвращает количество loopback портов
|
||||
int loopbackPortsCount() const { return lo_pcnt; }
|
||||
|
||||
|
||||
//! If not send_only starts all threaded reads
|
||||
//! \~english If not send_only starts all threaded reads
|
||||
//! \~russian Если не send_only запускает все потоковые чтения
|
||||
void startRead();
|
||||
|
||||
//! Stop all threaded reads
|
||||
//! \~english Stop all threaded reads
|
||||
//! \~russian Остановить все потоковые чтения
|
||||
void stopRead();
|
||||
|
||||
//! Reinit all PIEthernets with current \a PIEthernet::allAddresses()
|
||||
//! \~english Reinit all PIEthernets with current \a PIEthernet::allAddresses()
|
||||
//! \~russian Реинициализировать все PIEthernets с текущими \a PIEthernet::allAddresses()
|
||||
void reinit();
|
||||
|
||||
|
||||
//! Send packet
|
||||
//! \~english Send packet
|
||||
//! \~russian Отправить пакет
|
||||
void send(const PIByteArray & data);
|
||||
|
||||
EVENT1(receiveEvent, PIByteArray, data);
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
|
||||
class PIConfig;
|
||||
|
||||
//! \~english Complex I/O point
|
||||
//! \~russian Составное устройство ввода/вывода
|
||||
class PIP_EXPORT PIConnection: public PIObject {
|
||||
PIOBJECT_SUBCLASS(PIConnection, PIObject);
|
||||
|
||||
|
||||
@@ -29,14 +29,26 @@
|
||||
#include "pibasetransfer.h"
|
||||
|
||||
|
||||
//! \~english Class for send and receive PIByteArray via \a PIBaseTransfer
|
||||
//! \~russian Класс для отправки и приема PIByteArray с помощью \a PIBaseTransfer
|
||||
class PIP_EXPORT PIDataTransfer: public PIBaseTransfer {
|
||||
PIOBJECT_SUBCLASS(PIDataTransfer, PIBaseTransfer);
|
||||
|
||||
public:
|
||||
//! \~english Constructs empty data transfer
|
||||
//! \~russian Создает пустой transfer данных
|
||||
PIDataTransfer() { ; }
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
~PIDataTransfer() { ; }
|
||||
|
||||
//! \~english Send data
|
||||
//! \~russian Отправить данные
|
||||
bool send(const PIByteArray & ba);
|
||||
|
||||
//! \~english Get received data
|
||||
//! \~russian Получить принятые данные
|
||||
const PIByteArray & data() { return data_; }
|
||||
|
||||
private:
|
||||
|
||||
@@ -29,45 +29,61 @@
|
||||
#include "pibytearray.h"
|
||||
#include "pip_io_utils_export.h"
|
||||
|
||||
|
||||
//! \~english Base class for ethernet utils
|
||||
//! \~russian Базовый класс для утилит ethernet
|
||||
class PIP_IO_UTILS_EXPORT PIEthUtilBase {
|
||||
public:
|
||||
//! \~english Constructs PIEthUtilBase
|
||||
//! \~russian Создает PIEthUtilBase
|
||||
PIEthUtilBase();
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
~PIEthUtilBase();
|
||||
|
||||
//! Set crypt layer enabled
|
||||
//! \~english Set crypt layer enabled
|
||||
//! \~russian Включить слой шифрования
|
||||
void setCryptEnabled(bool on);
|
||||
|
||||
//! Enable crypt layer
|
||||
//! \~english Enable crypt layer
|
||||
//! \~russian Включить слой шифрования
|
||||
void cryptEnable();
|
||||
|
||||
//! Disable crypt layer
|
||||
//! \~english Disable crypt layer
|
||||
//! \~russian Выключить слой шифрования
|
||||
void cryptDisable();
|
||||
|
||||
//! Returns if crypt layer enabled
|
||||
//! \~english Returns if crypt layer enabled
|
||||
//! \~russian Возвращает, включен ли слой шифрования
|
||||
bool isCryptEnabled() const;
|
||||
|
||||
|
||||
//! Set crypt layer key to \"k\"
|
||||
//! \~english Set crypt layer key to "k"
|
||||
//! \~russian Установить ключ шифрования в "k"
|
||||
void setCryptKey(const PIByteArray & k);
|
||||
|
||||
//! Generate crypt layer key by \a PICrypt::hash and
|
||||
//! set crypt layer enabled
|
||||
//! \~english Generate crypt layer key by \a PICrypt::hash and set crypt layer enabled
|
||||
//! \~russian Сгенерировать ключ шифрования с помощью \a PICrypt::hash и включить шифрование
|
||||
void createCryptKey(const PIString & k);
|
||||
|
||||
//! Returns crypt layer key
|
||||
//! \~english Returns crypt layer key
|
||||
//! \~russian Возвращает ключ шифрования
|
||||
PIByteArray cryptKey() const;
|
||||
|
||||
//! \brief Returns addition size for crypted data.
|
||||
//! \~english Returns addition size for crypted data
|
||||
//! \~russian Возвращает дополнительный размер для зашифрованных данных
|
||||
static size_t cryptSizeAddition();
|
||||
|
||||
protected:
|
||||
/*! \brief Returns encrypted data if layer enabled,
|
||||
* otherwise returns unchanged \"data\" */
|
||||
//! \~english Returns encrypted data if layer enabled, otherwise returns unchanged "data"
|
||||
//! \~russian Возвращает зашифрованные данные, если слой включен, иначе возвращает неизмененные "data"
|
||||
PIByteArray cryptData(const PIByteArray & data);
|
||||
|
||||
/*! \brief Returns decrypted data if layer enabled,
|
||||
* otherwise returns unchanged \"data\". If decryption
|
||||
* was unsuccessfull returns empty %PIByteArray. */
|
||||
//! \~english Returns decrypted data if layer enabled, otherwise returns unchanged "data". If decryption was unsuccessful returns empty
|
||||
//! %PIByteArray
|
||||
//! \~russian Возвращает расшифрованные данные, если слой включен, иначе возвращает неизмененные "data". Если расшифровка неуспешна,
|
||||
//! возвращает пустой %PIByteArray
|
||||
PIByteArray decryptData(const PIByteArray & data);
|
||||
|
||||
private:
|
||||
|
||||
@@ -31,25 +31,40 @@
|
||||
|
||||
#define __PIFILETRANSFER_VERSION 2
|
||||
|
||||
//! \~english Class for send and receive files and directories via \a PIBaseTransfer
|
||||
//! \~russian Класс для отправки и приема файлов и папок с помощью \a PIBaseTransfer
|
||||
class PIP_EXPORT PIFileTransfer: public PIBaseTransfer {
|
||||
PIOBJECT_SUBCLASS(PIFileTransfer, PIBaseTransfer);
|
||||
|
||||
public:
|
||||
//! \~english Constructs empty file transfer
|
||||
//! \~russian Создает пустой transfer файлов
|
||||
PIFileTransfer();
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
~PIFileTransfer();
|
||||
|
||||
//! \~english Step type for file transfer
|
||||
//! \~russian Тип шага для передачи файлов
|
||||
enum StepType {
|
||||
pft_None,
|
||||
pft_Description,
|
||||
pft_Data
|
||||
};
|
||||
|
||||
//! \~english File information structure
|
||||
//! \~russian Структура информации о файле
|
||||
struct PIP_EXPORT PFTFileInfo: public PIFile::FileInfo {
|
||||
//! \~english Constructor
|
||||
//! \~russian Конструктор
|
||||
PFTFileInfo(const PIFile::FileInfo & fi = PIFile::FileInfo()): PIFile::FileInfo(fi) {}
|
||||
PIString dest_path;
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
//! \~english File transfer header structure
|
||||
//! \~russian Структура заголовка передачи файлов
|
||||
struct PIP_EXPORT PFTHeader {
|
||||
union {
|
||||
struct {
|
||||
@@ -60,6 +75,8 @@ public:
|
||||
};
|
||||
int step; // PacketType
|
||||
int session_id;
|
||||
//! \~english Check if signature is valid
|
||||
//! \~russian Проверка валидности подписи
|
||||
bool check_sig() {
|
||||
if (sig[0] != sign[0] || sig[1] != sign[1] || sig[2] != sign[2] || version != __PIFILETRANSFER_VERSION) return false;
|
||||
return true;
|
||||
@@ -67,23 +84,64 @@ public:
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
//! \~english Send file
|
||||
//! \~russian Отправить файл
|
||||
bool send(const PIFile & file);
|
||||
|
||||
//! \~english Send file by path
|
||||
//! \~russian Отправить файл по пути
|
||||
bool send(const PIString & file);
|
||||
|
||||
//! \~english Send files list
|
||||
//! \~russian Отправить список файлов
|
||||
bool send(const PIStringList & files);
|
||||
|
||||
//! \~english Send file info
|
||||
//! \~russian Отправить информацию о файле
|
||||
bool send(PIFile::FileInfo entry) { return send(PIVector<PIFile::FileInfo>() << entry); }
|
||||
|
||||
//! \~english Send file info vector
|
||||
//! \~russian Отправить вектор информации о файлах
|
||||
bool send(PIVector<PIFile::FileInfo> entries);
|
||||
|
||||
//! \~english Set directory
|
||||
//! \~russian Установить директорию
|
||||
void setDirectory(const PIDir & d) { dir = d; }
|
||||
|
||||
//! \~english Set directory by path
|
||||
//! \~russian Установить директорию по пути
|
||||
void setDirectory(const PIString & path) { dir.setDir(path); }
|
||||
|
||||
//! \~english Get directory
|
||||
//! \~russian Получить директорию
|
||||
PIDir directory() const { return dir; }
|
||||
|
||||
//! \~english Check if transfer is started
|
||||
//! \~russian Проверить, начата ли передача
|
||||
bool isStarted() const { return started_; }
|
||||
|
||||
//! \~english Get current file name
|
||||
//! \~russian Получить имя текущего файла
|
||||
PIString curFile() const;
|
||||
|
||||
//! \~english Get total bytes of current file
|
||||
//! \~russian Получить общее количество байт текущего файла
|
||||
llong bytesFileAll() const { return bytes_file_all; }
|
||||
|
||||
//! \~english Get current bytes of current file
|
||||
//! \~russian Получить текущие байты текущего файла
|
||||
llong bytesFileCur() const { return bytes_file_cur; }
|
||||
|
||||
//! \~english Get pointer to current file name
|
||||
//! \~russian Получить указатель на имя текущего файла
|
||||
const PIString * curFile_ptr() const { return &cur_file_string; }
|
||||
|
||||
//! \~english Get pointer to total bytes of current file
|
||||
//! \~russian Получить указатель на общее количество байт текущего файла
|
||||
const llong * bytesFileAll_ptr() const { return &bytes_file_all; }
|
||||
|
||||
//! \~english Get pointer to current bytes of current file
|
||||
//! \~russian Получить указатель на текущие байты текущего файла
|
||||
const llong * bytesFileCur_ptr() const { return &bytes_file_cur; }
|
||||
|
||||
EVENT(receiveFilesStarted);
|
||||
|
||||
@@ -34,31 +34,45 @@
|
||||
class PIEthernet;
|
||||
|
||||
|
||||
//! \~english Ethernet device
|
||||
//! \~russian Устройство Ethernet
|
||||
class PIP_IO_UTILS_EXPORT PIPackedTCP: public PIIODevice {
|
||||
PIIODEVICE(PIPackedTCP, "ptcp");
|
||||
|
||||
public:
|
||||
//! \brief Role of %PIPackedTCP
|
||||
//! \~english Role of %PIPackedTCP
|
||||
//! \~russian Роль %PIPackedTCP
|
||||
enum Role {
|
||||
Client /** TCP client */,
|
||||
Server /** TCP server for one client */
|
||||
};
|
||||
|
||||
//! Contructs %PIPackedTCP with "role" and "addr" address
|
||||
//! \~english Constructs %PIPackedTCP with "role" and "addr" address
|
||||
//! \~russian Создает %PIPackedTCP с ролью "role" и адресом "addr"
|
||||
explicit PIPackedTCP(Role role = Client, const PINetworkAddress & addr = {});
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
virtual ~PIPackedTCP();
|
||||
|
||||
//! Set server address for Server role or connect address for Client
|
||||
//! \~english Set server address for Server role or connect address for Client
|
||||
//! \~russian Установить адрес сервера для роли Server или адрес подключения для Client
|
||||
void setAddress(const PINetworkAddress & addr);
|
||||
|
||||
//! \~english Check if connected
|
||||
//! \~russian Проверить подключение
|
||||
bool isConnected() const;
|
||||
|
||||
//! \~english Check if connecting
|
||||
//! \~russian Проверить подключение
|
||||
bool isConnecting() const;
|
||||
|
||||
//! Returns read address in format "i.i.i.i:p"
|
||||
//! \~english Returns read address in format "i.i.i.i:p"
|
||||
//! \~russian Возвращает адрес чтения в формате "i.i.i.i:p"
|
||||
PINetworkAddress address() const { return m_addr; }
|
||||
|
||||
//! Returns %PIEthernet type
|
||||
//! \~english Returns %PIEthernet type
|
||||
//! \~russian Возвращает тип %PIEthernet
|
||||
Role role() const { return m_role; }
|
||||
|
||||
EVENT0(connected);
|
||||
|
||||
@@ -41,12 +41,15 @@ typedef std::function<bool(const uchar *, int)> PacketExtractorPayloadFunc;
|
||||
/// Return true if packet is correct, false otherwise.
|
||||
typedef std::function<bool(const uchar *, const uchar *, int)> PacketExtractorFooterFunc;
|
||||
|
||||
//! \~english Packets extractor
|
||||
//! \~russian Извлекатель пакетов
|
||||
class PIP_EXPORT PIPacketExtractor: public PIIODevice {
|
||||
PIIODEVICE(PIPacketExtractor, "pckext");
|
||||
friend class PIConnection;
|
||||
|
||||
public:
|
||||
//! Extract algorithms
|
||||
//! \~english Extract algorithms
|
||||
//! \~russian Алгоритмы извлечения
|
||||
enum SplitMode {
|
||||
None /** No data processing */,
|
||||
Header /** Detect packets with \a header() and following \a payloadSize() */,
|
||||
@@ -56,64 +59,91 @@ public:
|
||||
Timeout /** Wait for first read, then read for \a timeout() */
|
||||
};
|
||||
|
||||
//! Contructs extractor with child device "device_" and extract algorithm "mode"
|
||||
//! \~english Constructs extractor with child device "device_" and extract algorithm "mode"
|
||||
//! \~russian Создает экстрактор с дочерним устройством "device_" и алгоритмом извлечения "mode"
|
||||
explicit PIPacketExtractor(PIIODevice * device_ = nullptr, SplitMode mode = None);
|
||||
|
||||
//! \~english Destructor
|
||||
//! \~russian Деструктор
|
||||
virtual ~PIPacketExtractor() { stop(); }
|
||||
|
||||
|
||||
//! Returns child %device
|
||||
//! \~english Returns child %device
|
||||
//! \~russian Возвращает дочернее устройство
|
||||
PIIODevice * device() { return dev; }
|
||||
|
||||
//! Set child %device to "device_"
|
||||
//! \~english Set child %device to "device_"
|
||||
//! \~russian Установить дочернее устройство в "device_"
|
||||
void setDevice(PIIODevice * device_);
|
||||
|
||||
//! \~english Get bytes available
|
||||
//! \~russian Получить доступные байты
|
||||
ssize_t bytesAvailable() const override;
|
||||
|
||||
//! \~english Set header check function
|
||||
//! \~russian Установить функцию проверки заголовка
|
||||
void setHeaderCheckSlot(PacketExtractorHeaderFunc f) { func_header = f; }
|
||||
|
||||
//! \~english Set payload check function
|
||||
//! \~russian Установить функцию проверки полезной нагрузки
|
||||
void setPayloadCheckSlot(PacketExtractorPayloadFunc f) { func_payload = f; }
|
||||
|
||||
//! \~english Set footer check function
|
||||
//! \~russian Установить функцию проверки окончания
|
||||
void setFooterCheckSlot(PacketExtractorFooterFunc f) { func_footer = f; }
|
||||
|
||||
|
||||
//! Set extract algorithm
|
||||
//! \~english Set extract algorithm
|
||||
//! \~russian Установить алгоритм извлечения
|
||||
void setSplitMode(SplitMode mode) { setProperty("splitMode", int(mode)); }
|
||||
|
||||
//! Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
||||
//! \~english Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
||||
//! \~russian Установить размер полезной нагрузки
|
||||
void setPayloadSize(int size);
|
||||
|
||||
//! Set header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~english Set header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~russian Установить данные заголовка
|
||||
void setHeader(const PIByteArray & data);
|
||||
|
||||
//! Set footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~english Set footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~russian Установить данные окончания
|
||||
void setFooter(const PIByteArray & data);
|
||||
|
||||
//! Set timeout, used for PIPacketExtractor::Timeout algorithm
|
||||
//! \~english Set timeout, used for PIPacketExtractor::Timeout algorithm
|
||||
//! \~russian Установить таймаут
|
||||
void setTimeout(PISystemTime tm) { setProperty("timeout", tm); }
|
||||
|
||||
|
||||
//! Returns current extract algorithm
|
||||
//! \~english Returns current extract algorithm
|
||||
//! \~russian Возвращает текущий алгоритм извлечения
|
||||
SplitMode splitMode() const { return mode_; }
|
||||
|
||||
//! Returns current payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer and PIPacketExtractor::Size
|
||||
//! algorithms
|
||||
//! \~english Returns current payload size
|
||||
//! \~russian Возвращает текущий размер полезной нагрузки
|
||||
int payloadSize() const { return dataSize; }
|
||||
|
||||
//! Returns current header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~english Returns current header data
|
||||
//! \~russian Возвращает текущие данные заголовка
|
||||
PIByteArray header() const { return src_header; }
|
||||
|
||||
//! Returns current footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms
|
||||
//! \~english Returns current footer data
|
||||
//! \~russian Возвращает текущие данные окончания
|
||||
PIByteArray footer() const { return src_footer; }
|
||||
|
||||
//! Returns current timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm
|
||||
//! \~english Returns current timeout in milliseconds
|
||||
//! \~russian Возвращает текущий таймаут в миллисекундах
|
||||
PISystemTime timeout() const { return time_; }
|
||||
|
||||
//! Returns missed by validating functions bytes count
|
||||
//! \~english Returns missed by validating functions bytes count
|
||||
//! \~russian Возвращает количество байт, пропущенных функциями проверки
|
||||
ullong missedBytes() const { return missed; }
|
||||
|
||||
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
||||
//! \~english Add data to extractor, raise \a packetReceived() if packet is ready
|
||||
//! \~russian Добавить данные в экстрактор, вызвать \a packetReceived() если пакет готов
|
||||
void appendData(const uchar * d, int s) { threadedRead(d, s); }
|
||||
|
||||
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
||||
//! \~english Add data to extractor, raise \a packetReceived() if packet is ready
|
||||
//! \~russian Добавить данные в экстрактор, вызвать \a packetReceived() если пакет готов
|
||||
void appendData(const PIByteArray & data) { threadedRead(data.data(), data.size_s()); }
|
||||
|
||||
EVENT2(packetReceived, const uchar *, data, int, size);
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
*
|
||||
**/
|
||||
|
||||
//! \~english Template helper class to automate structs receive
|
||||
//! \~russian Шаблонный класс для автоматизации приема структур
|
||||
template<typename Key>
|
||||
class PIParseHelper {
|
||||
public:
|
||||
|
||||
@@ -33,45 +33,65 @@
|
||||
|
||||
class PIIODevice;
|
||||
|
||||
//! \~english Stream packer configuration
|
||||
//! \~russian Конфигурация упаковщика потока
|
||||
class PIStreamPackerConfig: public PIEthUtilBase {
|
||||
friend class PIStreamPacker;
|
||||
|
||||
public:
|
||||
//! \~english Constructs default configuration
|
||||
//! \~russian Создает конфигурацию по умолчанию
|
||||
PIStreamPackerConfig() {
|
||||
crypt_size = false;
|
||||
crypt_size = false;
|
||||
aggressive_optimization = true;
|
||||
max_packet_size = 1400;
|
||||
packet_sign = 0xAFBE;
|
||||
}
|
||||
|
||||
//! Set maximum size of single packet
|
||||
//! \~english Set maximum size of single packet
|
||||
//! \~russian Установить максимальный размер одного пакета
|
||||
void setMaxPacketSize(int max_size) { max_packet_size = max_size; }
|
||||
|
||||
//! Returns maximum size of single packet, default 1400 bytes
|
||||
//! \~english Returns maximum size of single packet, default 1400 bytes
|
||||
//! \~russian Возвращает максимальный размер одного пакета, по умолчанию 1400 байт
|
||||
int maxPacketSize() const { return max_packet_size; }
|
||||
|
||||
//! Set packet sinature
|
||||
//! \~english Set packet signature
|
||||
//! \~russian Установить подпись пакета
|
||||
void setPacketSign(ushort sign_) { packet_sign = sign_; }
|
||||
|
||||
//! Returns packet sinature, default 0xAFBE
|
||||
//! \~english Returns packet signature, default 0xAFBE
|
||||
//! \~russian Возвращает подпись пакета, по умолчанию 0xAFBE
|
||||
ushort packetSign() const { return packet_sign; }
|
||||
|
||||
//! Set receive aggressive optimization. If yes then %PIStreamPacker doesn`t
|
||||
//! check every byte in incoming stream but check only begin of each read()
|
||||
//! result. Default is \b true.
|
||||
//! \~english Set receive aggressive optimization. If yes then %PIStreamPacker doesn`t check every byte in incoming stream but check
|
||||
//! only begin of each read() result. Default is \b true.
|
||||
//! \~russian Установить агрессивную оптимизацию приема. Если да, то %PIStreamPacker не проверяет каждый байт во входящем потоке, а
|
||||
//! только начало каждого результата read(). По умолчанию \b true.
|
||||
void setaAggressiveOptimization(bool yes) { aggressive_optimization = yes; }
|
||||
|
||||
//! Returns aggressive optimization
|
||||
//! \~english Returns aggressive optimization
|
||||
//! \~russian Возвращает агрессивную оптимизацию
|
||||
bool aggressiveOptimization() const { return aggressive_optimization; }
|
||||
|
||||
//! \~english Check if crypt size enabled
|
||||
//! \~russian Проверить, включен ли размер шифрования
|
||||
bool cryptSizeEnabled() const { return crypt_size; }
|
||||
|
||||
//! \~english Set crypt size enabled
|
||||
//! \~russian Установить включенный размер шифрования
|
||||
void setCryptSizeEnabled(bool on) { crypt_size = on; }
|
||||
|
||||
//! Get configuration
|
||||
//! \~english Get configuration
|
||||
//! \~russian Получить конфигурацию
|
||||
const PIStreamPackerConfig & configuration() const { return *this; }
|
||||
|
||||
//! \~english Get configuration
|
||||
//! \~russian Получить конфигурацию
|
||||
PIStreamPackerConfig & configuration() { return *this; }
|
||||
|
||||
//! Apply configuration
|
||||
//! \~english Apply configuration
|
||||
//! \~russian Применить конфигурацию
|
||||
void setConfiguration(const PIStreamPackerConfig & config) { *this = config; }
|
||||
|
||||
private:
|
||||
@@ -81,31 +101,40 @@ private:
|
||||
};
|
||||
|
||||
|
||||
//! \~english Simple packet wrap around any PIIODevice
|
||||
//! \~russian Простая фрагментация пакетов, использует любой PIIODevice
|
||||
class PIP_IO_UTILS_EXPORT PIStreamPacker
|
||||
: public PIObject
|
||||
, public PIStreamPackerConfig {
|
||||
PIOBJECT(PIStreamPacker)
|
||||
|
||||
public:
|
||||
//! Contructs packer and try to assign \"dev\"
|
||||
//! \~english Constructs packer and try to assign "dev"
|
||||
//! \~russian Создает упаковщик и пытается присвоить "dev"
|
||||
PIStreamPacker(PIIODevice * dev = nullptr);
|
||||
|
||||
//! Returns progress of current packet receive in bytes
|
||||
//! \~english Returns progress of current packet receive in bytes
|
||||
//! \~russian Возвращает прогресс приема текущего пакета в байтах
|
||||
int receivePacketProgress() const { return packet.size_s(); }
|
||||
|
||||
//! \~english Clear all buffers
|
||||
//! \~russian Очистить все буферы
|
||||
void clear();
|
||||
|
||||
//! Prepare data for send and raise \a sendRequest() events
|
||||
//! \~english Prepare data for send and raise \a sendRequest() events
|
||||
//! \~russian Подготовить данные для отправки и вызвать события \a sendRequest()
|
||||
void send(const PIByteArray & data);
|
||||
|
||||
//! Receive data part. If packet is ready, raise \a packetReceiveEvent() event
|
||||
//! and \a packetReceived() virtual method
|
||||
//! \~english Receive data part. If packet is ready, raise \a packetReceiveEvent() event and \a packetReceived() virtual method
|
||||
//! \~russian Принять часть данных. Если пакет готов, вызвать событие \a packetReceiveEvent() и виртуальный метод \a packetReceived()
|
||||
void received(const PIByteArray & data);
|
||||
|
||||
EVENT_HANDLER2(void, received, const uchar *, readed, ssize_t, size);
|
||||
|
||||
//! Connect \"dev\" \a PIIODevice::threadedReadEvent() event to \a received() handler
|
||||
//! and \a sendRequest() event to \"dev\" \a PIIODevice::write() handler
|
||||
//! \~english Connect "dev" \a PIIODevice::threadedReadEvent() event to \a received() handler and \a sendRequest() event to "dev" \a
|
||||
//! PIIODevice::write() handler
|
||||
//! \~russian Подключить событие \a PIIODevice::threadedReadEvent() устройства "dev" к обработчику \a received() и событие \a
|
||||
//! sendRequest() к обработчику \a PIIODevice::write()
|
||||
void assignDevice(PIIODevice * dev);
|
||||
|
||||
EVENT1(packetReceiveEvent, PIByteArray &, data);
|
||||
|
||||
Reference in New Issue
Block a user