ИнформацияОКомпонентеИзФайла (БСП)

Автор: 1С
ОбщийМодуль.ВнешниеКомпонентыСлужебный
БСП

Информация компоненте из файла. Разбирает файл компоненты для получения служебной информации о компоненте

// Разбирает файл компоненты для получения служебной информации о компоненте
//
// Параметры:
//  ДвоичныеДанные - ДвоичныеДанные - двоичные данные файла компоненты.
//  ВыполнятьРазборИнфоФайла - Булево - (необязательный) требуется ли дополнительно анализировать
//          данные файла 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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ИнформацияОКомпоненте (БСП)

ИмяФайлаКомпоненты (БСП)

ЗагрузитьКомпонентуИзФайла (БСП)

ИнформацияОСохраненнойКомпоненте (БСП)

ЗагрузитьКомпонентуИзФайлаПослеЗагрузкиКомпоненты (БСП)

СохранитьКомпонентуВФайл (БСП)

АктуальныеВерсииВнешнихКомпонент (БСП)

ВерсииВнешнихКомпонент (БСП)

TurboConf ИР адаптер 1.82