Skip to content

Commit

Permalink
Merge pull request #141 from bia-technologies/feature/pause
Browse files Browse the repository at this point in the history
Реализация кроссплатформеной паузы
  • Loading branch information
alkoleft authored Aug 22, 2023
2 parents dbae800 + cd2bc49 commit f4f5f7a
Show file tree
Hide file tree
Showing 16 changed files with 477 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
Expand Down Expand Up @@ -158,6 +159,13 @@

КонецПроцедуры

Процедура ОбработчикПодключитьКомпоненты(Результат, ДополнительныеПараметры) Экспорт

ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент();
ВызватьСледующийОбработчик(ДополнительныеПараметры);

КонецПроцедуры

#КонецОбласти

Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
Expand Down
104 changes: 104 additions & 0 deletions exts/yaxunit/src/CommonModules/ЮТКомпоненты/Module.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//

#Область ПрограммныйИнтерфейс

// Возвращает внешнюю компоненту, реализующую паузу
//
// Возвращаемое значение:
// ВнешнийОбъект
Функция Пауза() Экспорт

Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза());

КонецФункции

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Создает внешнюю компоненту по описанию
//
// Параметры:
// ОписаниеКомпоненты - см. ОписаниеКомпоненты
//
// Возвращаемое значение:
// ВнешнийОбъект
Функция СоздатьКомпоненту(ОписаниеКомпоненты) Экспорт

Если ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина) Тогда
Возврат Новый (ОписаниеКомпоненты.ИмяКласса);
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту " + ОписаниеКомпоненты.ИмяКласса;
КонецЕсли;

КонецФункции

// Подключает внещнюю компоненту из макета
//
// Параметры:
// ИмяМакета - Строка - Имя макета, в котором хранится компонента
// ИмяКомпоненты - Строка - Имя компоненты
// Кэшировать - Булево - Кэшировать создание компоненты
//
// Возвращаемое значение:
// Булево - Успешность подключения
Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Кэшировать) Экспорт

Если Кэшировать Тогда
Возврат ЮТПовторногоИспользования.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты);
КонецЕсли;

Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);

КонецФункции

// Описание компоненты реализующей паузу.
//
// Возвращаемое значение:
// см. ОписаниеКомпоненты
Функция ОписаниеКомпонентыПауза() Экспорт

Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТYaxUnitAddIn", "YaxUnitAddin", "Sleep");

КонецФункции

// Описание внешней компоненты.
//
// Параметры:
// ИмяМакета - Строка - Имя макета, в котором хранится компонента
// ИмяКомпоненты - Строка -Имя компоненты
// ИмяКласса - Строка - Имя класса, по которому создается компонента
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Описание компоненты:
// * ИмяМакета - Строка - Имя макета, в котором хранится компонента
// * ИмяКомпоненты - Строка -Имя компоненты
// * ИмяКласса - Строка - Имя класса
Функция ОписаниеКомпоненты(ИмяМакета, ИмяКомпоненты, ИмяКласса) Экспорт

Описание = Новый Структура;
Описание.Вставить("ИмяМакета", ИмяМакета);
Описание.Вставить("ИмяКомпоненты", ИмяКомпоненты);
Описание.Вставить("ИмяКласса", СтрШаблон("AddIn.%1.%2", ИмяКомпоненты, ИмяКласса));

Возврат Новый ФиксированнаяСтруктура(Описание);

КонецФункции

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="76e16534-934b-43af-9f91-4a2849ed5f35">
<name>ЮТКомпоненты</name>
<synonym>
<key>ru</key>
<value>Компоненты</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//

#Область СлужебныйПрограммныйИнтерфейс

Функция ФайлКомпоненты(Знач ИмяМакета, Знач ОперационнаяСистема, Знач Архитектура) Экспорт

Данные = ЮТОбщийВызовСервера.Макет(ИмяМакета);
ЧтениеАрхива = Новый ЧтениеZipФайла();
ЧтениеАрхива.Открыть(Данные.ОткрытьПотокДляЧтения());

ИмяФайлаКомпоненты = ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура);

Если ИмяФайлаКомпоненты = Неопределено Тогда
ВызватьИсключение "Компонента не поддерживает клиентское окружение";
КонецЕсли;

Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайлаКомпоненты);

Возврат Новый ФиксированнаяСтруктура("ИмяФайла, Данные", ИмяФайлаКомпоненты, Данные);

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура)

Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, "MANIFEST.XML");

Если Данные = Неопределено Тогда
ВызватьИсключение "Архив компоненты не содержит манифеста";
КонецЕсли;

ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьПоток(Данные.ОткрытьПотокДляЧтения());

ИмяФайлаКомпоненты = Неопределено;

Пока ЧтениеXML.Прочитать() Цикл

Если ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура) Тогда
ИмяФайлаКомпоненты = ЧтениеXML.ЗначениеАтрибута("path");
Прервать;
КонецЕсли;

КонецЦикла;

ЧтениеXML.Закрыть();

Возврат ИмяФайлаКомпоненты;

КонецФункции

Функция ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура)

Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента ИЛИ СтрСравнить(ЧтениеXML.Имя, "component") <> 0 Тогда
Возврат Ложь;
КонецЕсли;

ОперационнаяСистемаУзла = ЧтениеXML.ЗначениеАтрибута("os");
АрхитектураУзла = ЧтениеXML.ЗначениеАтрибута("arch");

Возврат ОперационнаяСистема = ОперационнаяСистемаУзла И Архитектура = АрхитектураУзла;

КонецФункции

Функция ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайла)

ЭлементФайла = Неопределено;

Для Каждого Элемент Из ЧтениеАрхива.Элементы Цикл
Если СтрСравнить(Элемент.ПолноеИмя, ИмяФайла) = 0 Тогда
ЭлементФайла = Элемент;
КонецЕсли;
КонецЦикла;

Если ЭлементФайла = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;

ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЧтениеАрхива.Извлечь(ЭлементФайла, ИмяВременногоФайла, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);

Данные = Новый ДвоичныеДанные(ЮТФайлы.ОбъединитьПути(ИмяВременногоФайла, ИмяФайла));
УдалитьФайлы(ИмяВременногоФайла);

Возврат Данные;

КонецФункции

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="20617de9-dab7-4587-a43a-4330e51bbc64">
<name>ЮТКомпонентыВызовСервера</name>
<synonym>
<key>ru</key>
<value>Компоненты вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//

#Область СлужебныйПрограммныйИнтерфейс

Функция ТихаяУстановкаКомпонент() Экспорт

Успешно = Истина;
#Если Клиент И НЕ ВебКлиент Тогда

Компоненты = ЮТОбщий.ЗначениеВМассиве(ЮТКомпоненты.ОписаниеКомпонентыПауза());

Для Каждого Компонента Из Компоненты Цикл
ТихаяУстановкаВнешнейКомпоненты(Компонента.ИмяМакета);
КонецЦикла;
#КонецЕсли

Возврат Успешно;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ТихаяУстановкаВнешнейКомпоненты(ИмяМакета)

Информация = Новый СистемнаяИнформация();
ОперационнаяСистема = Неопределено;
Архитектура = Неопределено;

Linux = "Linux";
Windows = "Windows";
MacOS = "MacOS";
x86 = "i386";
x64 = "x86_64";

ТипКлиентскойПлатформы = Информация.ТипПлатформы;

Если ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86 Тогда
ОперационнаяСистема = Linux;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86_64 Тогда
ОперационнаяСистема = Linux;
Архитектура = x64;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86 Тогда
ОперационнаяСистема = Windows;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ОперационнаяСистема = Windows;
Архитектура = x64;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86 Тогда
ОперационнаяСистема = MacOS;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86_64 Тогда
ОперационнаяСистема = MacOS;
Архитектура = x64;
Иначе
ВызватьИсключение "Неподдерживаемый тип платформы";
КонецЕсли;

ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(ИмяМакета, ОперационнаяСистема, Архитектура);

Путь = РабочийКаталогДанныхПользователя();
КорневойКаталог = ЮТФайлы.ОбъединитьПути(Путь, "..", "..", "..");

КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT");
ФайлРеестра = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, "registry.xml");
ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, ДанныеФайла.ИмяФайла);

ДанныеФайла.Данные.Записать(ФайлКомпоненты);
ЗаписатьВРеестр(ФайлРеестра, ДанныеФайла.ИмяФайла);

КонецПроцедуры

Процедура ЗаписатьВРеестр(ФайлРеестра, ИмяФайла)

Данные = Новый ДвоичныеДанные(ФайлРеестра);
Текст = ПолучитьСтрокуИзДвоичныхДанных(Данные);

Если СтрНайти(Текст, "<component") = 0 Тогда // Файл пустой
Текст = СтрШаблон("<?xml version=""1.0"" encoding=""UTF-8""?>
|<registry xmlns=""http://v8.1c.ru/8.2/addin/registry"">
| <component path=""%1"" type=""native""/>
|</registry>", ИмяФайла);
ИначеЕсли СтрНайти(Текст, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна
Возврат;
Иначе // Добавляем компоненту
Запись = СтрШаблон(" <component path=""%1"" type=""native""/>", ИмяФайла);
Текст = СтрЗаменить(Текст, "</registry>", Запись + Символы.ПС + "</registry>");
КонецЕсли;

Данные = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Истина);
Данные.Записать(ФайлРеестра);

КонецПроцедуры

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fde2e089-b73c-4596-b283-959c570ff45d">
<name>ЮТКомпонентыКлиент</name>
<synonym>
<key>ru</key>
<value>Компоненты клиент</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>
Loading

0 comments on commit f4f5f7a

Please sign in to comment.