//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|          Реализация сервера TCPIP на основе внешней компоненты netainet.dll               |
//	+                                       ShmalevoZ                                           +
//	|                                        2008-01                                            |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Зависим от
// 	- Сервис.Событие.Менеджер
// 	- Сервис.Событие.Делегат.Сеть.NetaInet

//---------------------------------------------------------------------------------------------
// Событвенные атрибуты
Перем гСсылкаНаДелегатаСобытий;

//******************************************************************************
// _this(СсылкаКонтекст)
//
// Параметры: 
//  СсылкаКонтекст
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  ТекстОписания
//
Функция _this(СсылкаКонтекст)
	
	Возврат СсылкаКонтекст;
	
КонецФункции // _this()


//******************************************************************************
// Конструктор()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Предопределенный метод
//
Процедура Конструктор()
	
	//---------------------------------------------------------------------------------------------
	// Получим ссылку на делегата событий
	Регистратор		= СоздатьОбъект("Общие.Статик.Регистратор");
	МенеджерСобытий	= Регистратор.Получить("Общие.Статик.Объект.МенеджерСобытий");
	Идентификатор	= "Общие.Событие.Делегат.Сеть.NetaInet";
	Если МенеджерСобытий.Зарегистрирован(Идентификатор) = 0 Тогда
		МенеджерСобытий.ДобавитьДелегата(Идентификатор);
	КонецЕсли;
	НомерДелегата				= МенеджерСобытий.НайтиДелегата(Идентификатор);
	гСсылкаНаДелегатаСобытий	= МенеджерСобытий.ПолучитьДелегата(НомерДелегата);
	
КонецПроцедуры // Конструктор()


//******************************************************************************
// Адрес()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Строка	- сетевой адрес компьютера
//
// Описание:
//  
//
Функция Адрес() Экспорт
	
	Возврат гСсылкаНаДелегатаСобытий.ПолучитьТекущийАдрес();
	
КонецФункции // Адрес()


//******************************************************************************
// Порт()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Число	- номер прослушиваемого порта
//
// Описание:
//  
//
Функция Порт() Экспорт
	
	Возврат гСсылкаНаДелегатаСобытий.ПолучитьТекущийПорт();
	
КонецФункции // Порт()


//******************************************************************************
// ПолучитьСтруктуруТаблицыИнформацииОКлиенте()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Таблица значений	- структура таблицы информации о клиентах
//
// Описание:
//  
//
Функция ПолучитьСтруктуруТаблицыИнформацииОКлиенте()
	
	Результат	= СоздатьОбъект("ТаблицаЗначений");
	Результат.НоваяКолонка("Адрес");
	Результат.НоваяКолонка("Порт");
	Результат.НоваяКолонка("ИмяКомпьютера");
	
	Возврат Результат;
КонецФункции // ПолучитьСтруктуруТаблицыИнформацииОКлиенте()


//******************************************************************************
// ПолучитьТаблицуДоступныхКлиентов()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Таблица значений	- таблица с информацией о доступных клиентах
//
// Описание:
//  Производит поиск файлов в каталоге ИБ по маске *.info,
//  если в найденном файле(ах) хранится информация о доступных
//  серверах сообщений, то возвращает ее.
//  
//  Информация о текущем компьютере не возвращается
//
Функция ПолучитьТаблицуДоступныхКлиентов() Экспорт
	
	Результат		= ПолучитьСтруктуруТаблицыИнформацииОКлиенте();
	
    КаталогПоиска	= КаталогИБ();
    
	Маска			= "*.info";
    МаскаПоиска		= КаталогПоиска + Маска;
    Файл			= ФС.НайтиПервыйФайл(МаскаПоиска);
	СписокФайлов	= СоздатьОбъект("СписокЗначений");

	Пока ПустаяСтрока(Файл) = 0 Цикл
		
        Расположение    = КаталогПоиска+Файл;
        Файл            = ФС.НайтиСледующийФайл();
        
        Если (Прав(Расположение, 2) = "\.") или (Прав(Расположение, 3) = "\..") Тогда
            Продолжить;
        КонецЕсли;
        
        Атрибуты    = "";
        ФС.АтрибутыФайла(Расположение, , Атрибуты);
        Если Сред(Атрибуты, 4, 1) = "1" Тогда
            Продолжить;
        КонецЕсли;
        
        СписокФайлов.ДобавитьЗначение(Расположение);
    КонецЦикла;
	
	КоличествоФайлов	= СписокФайлов.РазмерСписка();
	
	Для НомерФайла = 1 По КоличествоФайлов Цикл
		
		Параметры			= СоздатьОбъект("Файл.INI");
		Если Параметры.Загрузить(СписокФайлов.ПолучитьЗначение(НомерФайла)) = 0 Тогда
			Продолжить;
		КонецЕсли;
		Если Параметры.Секции().Существует("Сервер") = 0 Тогда
			Продолжить;
		КонецЕсли;
		СекцияИнформация	= Параметры.Секция("Сервер");
		
		// информацию о самих себе не возвращаем
		Если (СекцияИнформация.Параметр("Адрес").Значение = Адрес()) и (Число(СекцияИнформация.Параметр("Порт").Значение) = Порт()) Тогда
			Продолжить;
		КонецЕсли;
		
		Результат.НоваяСтрока();
		Результат.Адрес			= СекцияИнформация.Параметр("Адрес").Значение;
		Результат.Порт			= Число(СекцияИнформация.Параметр("Порт").Значение);
		Результат.ИмяКомпьютера	= СекцияИнформация.Параметр("ИмяКомпьютера").Значение
	КонецЦикла;
	
	Возврат Результат;
КонецФункции // ПолучитьТаблицуДоступныхКлиентов()


//******************************************************************************
// Отправить(Адрес, Порт, ТекстСообщения)
//
// Параметры: 
//  Адрес, Порт, ТекстСообщения
//
// Возвращаемое значение:
//  Любое, возвращенное удаленной машиной
//
// Описание:
//  Отправляет сообщение на удаленную машину
//  
//  Технология следующая : 
//  	формируется сообщение, 
//  	для отправки вызывается модально обработка
//  	обработка активна до тех пор, пока не придет подтверждения, либо пользователь не нажмет отмены
//  	поступившее в метод ОбработатьСообщение сообщение проверяется на то что оно является 
//  		ответом на исходящее, и если да
//  	вызывается метод ПриОтветеИзСети открытой обработки
//  	обработка ответа, возврат полученных данных
//  	
//
Функция Отправить(Адрес, Порт, ТекстСообщения) Экспорт
	
	Возврат гСсылкаНаДелегатаСобытий.Отправить(Адрес, Порт, ТекстСообщения);
	
КонецФункции // Отправить()
