Информация компоненте из файла. Разбирает файл компоненты для получения служебной информации о компоненте
// Разбирает файл компоненты для получения служебной информации о компоненте
//
// Параметры:
// ДвоичныеДанные - ДвоичныеДанные - двоичные данные файла компоненты.
// ВыполнятьРазборИнфоФайла - Булево - (необязательный) требуется ли дополнительно анализировать
// данные файла INFO.XML, если он есть.
// ПараметрыПоискаДополнительнойИнформации - Соответствие - (необязательный)
// См. ВнешниеКомпонентыКлиент.ПараметрыЗагрузки.
//
// Возвращаемое значение:
// Структура - состав информации.
// * Разобрано - Булево - признак успешного разбора компоненты.
// * Реквизиты - Структура - разобранные реквизиты компоненты.
// ** Windows_x86 - Булево
// ** Windows_x86_64 - Булево
// ** Linux_x86 - Булево
// ** Linux_x86_64 - Булево
// ** Windows_x86_Firefox - Булево
// ** Linux_x86_Firefox - Булево
// ** Linux_x86_64_Firefox - Булево
// ** Windows_x86_MSIE - Булево
// ** Windows_x86_64_MSIE - Булево
// ** Windows_x86_Chrome - Булево
// ** Linux_x86_Chrome - Булево
// ** Linux_x86_64_Chrome - Булево
// ** MacOS_x86_64_Safari - Булево
// ** Идентификатор - Строка
// ** Наименование - Строка
// ** Версия - Строка
// ** ДатаВерсии - Дата
// ** ИмяФайла - Строка
// * ДвоичныеДанные - ДвоичныеДанные - выгрузка файла компоненты.
// * ДополнительнаяИнформация - Соответствие - информация, полученная по переданным параметрам поиска.
// * ОписаниеОшибки - Строка - текст ошибки, в случае, если не разобрано.
//
Функция ИнформацияОКомпонентеИзФайла(ДвоичныеДанные, ВыполнятьРазборИнфоФайла = Истина,
Знач ПараметрыПоискаДополнительнойИнформации = Неопределено) Экспорт
Если ПараметрыПоискаДополнительнойИнформации = Неопределено Тогда
ПараметрыПоискаДополнительнойИнформации = Новый Соответствие;
КонецЕсли;
// Значения заполнения по умолчанию.
Реквизиты = РеквизитыКомпоненты();
// Дополнительная запрашиваемая информация.
ДополнительнаяИнформация = Новый Соответствие;
// Контроль соответствия компоненты.
НайденМанифест = Ложь;
// Разбор данных архива компоненты.
Попытка
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ЧтениеАрхива = Новый ЧтениеZipФайла(Поток);
Исключение
ТекстОшибки = НСтр("ru = 'В файле отсутствует информация о компоненте.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецПопытки;
ВременныйКаталог = ФайловаяСистема.СоздатьВременныйКаталог("ExtComp");
Для Каждого ЭлементАрхива Из ЧтениеАрхива.Элементы Цикл
Если ЭлементАрхива.Зашифрован Тогда
// Очищаем временные файлы и освобождаем память.
ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог);
ЧтениеАрхива.Закрыть();
Поток.Закрыть();
ТекстОшибки = НСтр("ru = 'ZIP-архив не должен быть зашифрован.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецЕсли;
Попытка
// Поиск и разбор манифеста.
Если НРег(ЭлементАрхива.ИсходноеПолноеИмя) = "manifest.xml" Тогда
Реквизиты.ДатаВерсии = ЭлементАрхива.ВремяИзменения;
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
РазобратьМанифестКомпоненты(ВременныйФайлXML, Реквизиты);
НайденМанифест = Истина;
КонецЕсли;
Если НРег(ЭлементАрхива.ИсходноеПолноеИмя) = "info.xml" И ВыполнятьРазборИнфоФайла Тогда
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
РазобратьИнфоКомпоненты(ВременныйФайлXML, Реквизиты);
КонецЕсли;
Для Каждого ПараметрПоиска Из ПараметрыПоискаДополнительнойИнформации Цикл
ИмяФайлаXML = ПараметрПоиска.Значение.ИмяФайлаXML;
Если ЭлементАрхива.ИсходноеПолноеИмя = ИмяФайлаXML Тогда
КлючДополнительнойИнформации = ПараметрПоиска.Ключ;
ВыражениеXPath = ПараметрПоиска.Значение.ВыражениеXPath;
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
ДокументDOM = ДокументDOM(ВременныйФайлXML);
ЗначениеXPath = ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM);
ДополнительнаяИнформация.Вставить(КлючДополнительнойИнформации, ЗначениеXPath);
КонецЕсли;
КонецЦикла;
Исключение
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при разборе файла %1
|%2'"),
ЭлементАрхива.ИсходноеПолноеИмя,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Результат;
КонецПопытки;
КонецЦикла;
// Очищаем временные файлы и освобождаем память.
ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог);
ЧтениеАрхива.Закрыть();
Поток.Закрыть();
// Контроль соответствия компоненты.
Если Не НайденМанифест Тогда
ТекстОшибки = НСтр("ru = 'В архиве компоненты отсутствует обязательный файл MANIFEST.XML.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецЕсли;
Результат = РезультатРазбораКомпоненты();
Результат.Разобрано = Истина;
Результат.Реквизиты = Реквизиты;
Результат.ДвоичныеДанные = ДвоичныеДанные;
Результат.ДополнительнаяИнформация = ДополнительнаяИнформация;
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ЗагрузитьКомпонентуИзФайла (БСП)
ИнформацияОСохраненнойКомпоненте (БСП)
ЗагрузитьКомпонентуИзФайлаПослеЗагрузкиКомпоненты (БСП)
СохранитьКомпонентуВФайл (БСП)