1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-27 02:43:54 +02:00

Начало оснастки TCP

This commit is contained in:
Anton Titovets 2024-12-13 11:50:16 +03:00
parent ae6ea71c16
commit 2d01fc160b
24 changed files with 6254 additions and 5896 deletions

View File

@ -116,6 +116,7 @@
МассивИсключаемыхРасширений.Добавить(".dll");
МассивИсключаемыхРасширений.Добавить(".so");
МассивИсключаемыхРасширений.Добавить(".exe");
МассивИсключаемыхРасширений.Добавить(".zip");
Для Каждого ФайлПроекта Из ВсеФайлы Цикл

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,14 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "OPI_TCPClient"
version = "0.1.0"
dependencies = [
"addin1c",
"native-tls",
]
[[package]]
name = "addin1c"
version = "0.5.0"
@ -165,14 +173,6 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "opi_tcp"
version = "0.1.0"
dependencies = [
"addin1c",
"native-tls",
]
[[package]]
name = "pkg-config"
version = "0.3.31"

View File

@ -1,5 +1,5 @@
[package]
name = "opi_tcp"
name = "OPI_TCPClient"
version = "0.1.0"
edition = "2021"

Binary file not shown.

View File

@ -1,7 +1,7 @@
@echo off
:: Установить переменную
set LIB_NAME=opi_tcp
set LIB_NAME=OPI_TCPClient
set OPENSSL_DIR=C:\msys64\mingw64
set OPENSSL_LIB_DIR=%OPENSSL_DIR%\lib
set OPENSSL_INCLUDE_DIR=%OPENSSL_DIR%\include
@ -47,10 +47,15 @@ copy /y MANIFEST.XML "%OUTPUT_DIR%\MANIFEST.XML"
if errorlevel 1 goto :error
:: Архивация
set ZIP_NAME=addin.zip
powershell -Command "Compress-Archive -Path '%OUTPUT_DIR%\*' -Force -DestinationPath '%ZIP_NAME%'"
powershell -Command "Compress-Archive -Path '%OUTPUT_DIR%\*' -Force -DestinationPath '%LIB_NAME%.zip'"
if errorlevel 1 goto :error
copy /y "%LIB_NAME%.zip" "../../ru/OInt/addins/%LIB_NAME%.zip"
copy /y "%LIB_NAME%.zip" "../../en/OInt/addins/%LIB_NAME%.zip"
copy /y "%LIB_NAME%.zip" "../../ru/OPI/src/CommonTemplates/%LIB_NAME%/Template.addin"
copy /y "%LIB_NAME%.zip" "../../en/OPI/src/CommonTemplates/%LIB_NAME%/Template.addin"
if exist "%OUTPUT_DIR%" (
rmdir /S /Q "%OUTPUT_DIR%"
)

View File

@ -1,7 +1,7 @@
use std::io::{Read, Write};
use std::net::TcpStream;
use native_tls::TlsStream;
use std::time::Duration;
use std::time::{Duration, Instant};
pub enum Connection {
Tcp(TcpStream),
@ -43,10 +43,20 @@ pub fn send(connection: &mut Connection, data: Vec<u8>, timeout_ms: i32) -> bool
}
/// Считывает данные
pub fn receive(connection: &mut Connection, buffer_size: i32, timeout_ms: i32) -> Vec<u8> {
pub fn receive(
connection: &mut Connection,
buffer_size: i32,
timeout_ms: i32,
max_data_size: i32,
max_duration_ms: i32,
) -> Vec<u8> {
let mut result = Vec::new();
let mut buffer = vec![0u8; buffer_size as usize];
let start_time = Instant::now();
// Если max_duration_ms > 0, устанавливаем таймаут только если он не установлен
if max_duration_ms > 0 {
match connection {
Connection::Tcp(stream) => {
stream.set_read_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
@ -55,13 +65,20 @@ pub fn receive(connection: &mut Connection, buffer_size: i32, timeout_ms: i32) -
stream.get_ref().set_read_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
}
}
}
loop {
// Проверяем ограничения, если они заданы
if (max_data_size > 0 && result.len() >= max_data_size as usize) ||
(max_duration_ms > 0 && start_time.elapsed() > Duration::from_millis(max_duration_ms as u64)) {
break;
}
match connection.read(&mut buffer) {
Ok(0) => break, // Конец данных (EOF)
Ok(0) => break, // EOF - конец данных
Ok(size) => result.extend_from_slice(&buffer[..size]),
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => break, // Нет данных
Err(e) => break, // Любая другая ошибка
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => break, // Таймаут
Err(_) => break, // Любая другая ошибка
}
}
@ -69,6 +86,7 @@ pub fn receive(connection: &mut Connection, buffer_size: i32, timeout_ms: i32) -
}
/// Закрывает соединение
pub fn disconnect(add_in: &mut crate::component::AddIn) {
pub fn disconnect(add_in: &mut crate::component::AddIn) -> bool {
add_in.connection = None;
true
}

View File

@ -22,7 +22,7 @@ pub fn get_params_amount(num: usize) -> usize {
match num {
0 => 0,
1 => 0,
2 => 2,
2 => 4,
3 => 2,
_ => 0,
}
@ -43,9 +43,11 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
let size = params[0].get_i32().unwrap_or(0);
let timeout = params[1].get_i32().unwrap_or(0);
let maxsize = params[2].get_i32().unwrap_or(0);
let maxduration = params[3].get_i32().unwrap_or(0);
if let Some(ref mut connection) = obj.connection {
Box::new(methods::receive(connection, size, timeout))
Box::new(methods::receive(connection, size, timeout, maxsize, maxduration))
} else {
Box::new(Vec::<u8>::new()) // Если соединения нет, возвращаем пустой массив
}
@ -75,7 +77,7 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
// Синонимы
pub const PROPS: &[&[u16]] = &[
name!("Address"),
name!("SSL")
name!("SSL"),
];

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,158 @@
// OneScript: ./OInt/core/Modules/OPI_TCP.os
// Lib: TCP
// CLI: tcp
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область TCPКлиент
// !NOCLI
// Открыть соединение
// Создает TCP/TLS соединение
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
//
// Возвращаемое значение:
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("OPI_TCPClient");
TCPКлиент.Address = Адрес;
TCPКлиент.SSL = SSL;
Успех = TCPКлиент.Connect();
Возврат ?(Успех, TCPКлиент, Неопределено);
КонецФункции
// !NOCLI
// Закрыть соединение
// Явно закрывает созданное ранее соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
//
// Возвращаемое значение:
// Булево - всегда возвращает Истина
Функция ЗакрытьСоединение(Знач Соединение) Экспорт
Возврат Соединение.Disconnect();
КонецФункции
// !NOCLI
// Получить данные
// Читает данные из указанного соединения
//
// Примечание:
// При установке параметров Таймаут и Размер в 0, чтение производится до окончания сообщения
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Таймаут - Число - Время чтения данных (сек). 0 > до конца сообщения - timeout
// Размер - Число - Максимальный размер данных. 0 > без ограничений - size
//
// Возвращаемое значение:
// ДвоичныеДанные - Полученные данные
Функция ПолучитьДанные(Знач Соединение, Знач Таймаут = 0, Знач Размер = 0) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Размер);
Возврат Соединение.Read(1024, 150, Таймаут, Размер);
КонецФункции
// Подключиться и получить данные
// Создает соединение и читает данные до конца или по ограничениям
//
// Примечание:
// При установке параметров Таймаут и Размер в 0, чтение производится до окончания сообщения
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// Таймаут - Число - Время чтения данных (сек). 0 > до конца сообщения - timeout
// Размер - Число - Максимальный размер данных. 0 > без ограничений - size
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
//
// Возвращаемое значение:
// Строка, ДвоичныеДанные - Полученные данные
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
, Знач SSL = Ложь
, Знач Таймаут = 0
, Знач Размер = 0
, Знач Строкой = Истина
, Знач Кодировка = "UTF-8") Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Размер);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
Соединение = ОткрытьСоединение(Адрес, SSL);
Если Не ЗначениеЗаполнено(Соединение) Тогда
ВызватьИсключение "Не удалось создать Соединение";
КонецЕсли;
Сообщение = ПолучитьДанные(Соединение, Таймаут, Размер);
Если Строкой Тогда
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
КонецЕсли;
ЗакрытьСоединение(Соединение);
Возврат Сообщение;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -12,6 +12,7 @@
<module name="OPI_Ozon" file="core/Modules/OPI_Ozon.os"/>
<module name="OPI_S3" file="core/Modules/OPI_S3.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_TCP" file="core/Modules/OPI_TCP.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
<module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>

View File

@ -1528,19 +1528,6 @@
КонецФункции
Функция КаталогКомпонентOS() Экспорт
КаталогПрограммы = СтрЗаменить(КаталогПрограммы(), "\", "/");
ЭлементыПути = СтрРазделить(КаталогПрограммы, "/");
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
КаталогКомпонент = СтрСоединить(ЭлементыПути, "/") + "/lib/oint/addins/";
Возврат КаталогКомпонент;
КонецФункции
#Область РаботаСВнешнимиКомпонентами
Функция ИнициализироватьВнешнююКомпоненту(Знач ИмяКомпоненты, Знач Класс, Компонента)
@ -1556,25 +1543,26 @@
Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты)
ЭтоWindows = ЭтоWindows();
Если ЭтоWindows() Тогда
Постфикс = "_W";
Расширение = ".dll";
Иначе
Постфикс = "_L";
Расширение = ".so";
КонецЕсли;
ИмяМакета = ИмяКомпоненты + Постфикс;
Если ЭтоOneScript() Тогда
ИмяМакета = КаталогКомпонентOS() + ИмяМакета + Расширение;
ИмяМакета = КаталогКомпонентOS() + ИмяМакета + ".zip";
Иначе
ИмяМакета = "ОбщийМакет." + ИмяМакета;
КонецЕсли;
Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты);
КонецФункции
Функция КаталогКомпонентOS() Экспорт
КаталогПрограммы = СтрЗаменить(КаталогПрограммы(), "\", "/");
ЭлементыПути = СтрРазделить(КаталогПрограммы, "/");
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
КаталогКомпонент = СтрСоединить(ЭлементыПути, "/") + "/lib/oint/addins/";
Возврат КаталогКомпонент;
КонецФункции

View File

@ -0,0 +1,158 @@
// OneScript: ./OInt/core/Modules/OPI_TCP.os
// Lib: TCP
// CLI: tcp
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
// Раскомментировать, если выполняется OneScript
// #Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область TCPКлиент
// !NOCLI
// Открыть соединение
// Создает TCP/TLS соединение
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
//
// Возвращаемое значение:
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("OPI_TCPClient");
TCPКлиент.Address = Адрес;
TCPКлиент.SSL = SSL;
Успех = TCPКлиент.Connect();
Возврат ?(Успех, TCPКлиент, Неопределено);
КонецФункции
// !NOCLI
// Закрыть соединение
// Явно закрывает созданное ранее соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
//
// Возвращаемое значение:
// Булево - всегда возвращает Истина
Функция ЗакрытьСоединение(Знач Соединение) Экспорт
Возврат Соединение.Disconnect();
КонецФункции
// !NOCLI
// Получить данные
// Читает данные из указанного соединения
//
// Примечание:
// При установке параметров Таймаут и Размер в 0, чтение производится до окончания сообщения
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Таймаут - Число - Время чтения данных (сек). 0 > до конца сообщения - timeout
// Размер - Число - Максимальный размер данных. 0 > без ограничений - size
//
// Возвращаемое значение:
// ДвоичныеДанные - Полученные данные
Функция ПолучитьДанные(Знач Соединение, Знач Таймаут = 0, Знач Размер = 0) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Размер);
Возврат Соединение.Read(1024, 150, Таймаут, Размер);
КонецФункции
// Подключиться и получить данные
// Создает соединение и читает данные до конца или по ограничениям
//
// Примечание:
// При установке параметров Таймаут и Размер в 0, чтение производится до окончания сообщения
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// Таймаут - Число - Время чтения данных (сек). 0 > до конца сообщения - timeout
// Размер - Число - Максимальный размер данных. 0 > без ограничений - size
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
//
// Возвращаемое значение:
// Строка, ДвоичныеДанные - Полученные данные
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
, Знач SSL = Ложь
, Знач Таймаут = 0
, Знач Размер = 0
, Знач Строкой = Истина
, Знач Кодировка = "UTF-8") Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Размер);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
Соединение = ОткрытьСоединение(Адрес, SSL);
Если Не ЗначениеЗаполнено(Соединение) Тогда
ВызватьИсключение "Не удалось создать Соединение";
КонецЕсли;
Сообщение = ПолучитьДанные(Соединение, Таймаут, Размер);
Если Строкой Тогда
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
КонецЕсли;
ЗакрытьСоединение(Соединение);
Возврат Сообщение;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ed305045-7f7e-4dae-b254-e1e1bdb32293">
<name>OPI_TCP</name>
<synonym>
<key>ru</key>
<value>TCP</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -1528,19 +1528,6 @@
КонецФункции
Функция КаталогКомпонентOS() Экспорт
КаталогПрограммы = СтрЗаменить(КаталогПрограммы(), "\", "/");
ЭлементыПути = СтрРазделить(КаталогПрограммы, "/");
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
КаталогКомпонент = СтрСоединить(ЭлементыПути, "/") + "/lib/oint/addins/";
Возврат КаталогКомпонент;
КонецФункции
#Область РаботаСВнешнимиКомпонентами
Функция ИнициализироватьВнешнююКомпоненту(Знач ИмяКомпоненты, Знач Класс, Компонента)
@ -1556,25 +1543,26 @@
Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты)
ЭтоWindows = ЭтоWindows();
Если ЭтоWindows() Тогда
Постфикс = "_W";
Расширение = ".dll";
Иначе
Постфикс = "_L";
Расширение = ".so";
КонецЕсли;
ИмяМакета = ИмяКомпоненты + Постфикс;
Если ЭтоOneScript() Тогда
ИмяМакета = КаталогКомпонентOS() + ИмяМакета + Расширение;
ИмяМакета = КаталогКомпонентOS() + ИмяМакета + ".zip";
Иначе
ИмяМакета = "ОбщийМакет." + ИмяМакета;
КонецЕсли;
Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты);
КонецФункции
Функция КаталогКомпонентOS() Экспорт
КаталогПрограммы = СтрЗаменить(КаталогПрограммы(), "\", "/");
ЭлементыПути = СтрРазделить(КаталогПрограммы, "/");
ЭлементыПути.Удалить(ЭлементыПути.ВГраница());
КаталогКомпонент = СтрСоединить(ЭлементыПути, "/") + "/lib/oint/addins/";
Возврат КаталогКомпонент;
КонецФункции

View File

@ -56,6 +56,7 @@
<commonModules>CommonModule.OPI_Notion</commonModules>
<commonModules>CommonModule.OPI_Slack</commonModules>
<commonModules>CommonModule.OPI_S3</commonModules>
<commonModules>CommonModule.OPI_TCP</commonModules>
<commonModules>CommonModule.OPI_Telegram</commonModules>
<commonModules>CommonModule.OPI_Twitter</commonModules>
<commonModules>CommonModule.OPI_Viber</commonModules>