/// <summary> /// Получает ссылку на удаленный репозиторий, хранящийся на FTP сервере /// </summary> /// <param name="ftpHost">Адрес узла (IP-адрес или доменное имя)</param> /// <param name="ftpPort">TCP порт, на котором расположен FTP сервер</param> /// <param name="ftpUsername">Имя пользователя FTP сервера</param> /// <param name="ftpPassword">Пароль пользователя FTP сервера</param> /// <param name="deviceNumber">Номер устройства</param> /// <param name="locomotiveName">Название локомотива</param> /// <param name="sectionName">Название сервера</param> /// <param name="psnConfiguration">Конфигурация магистрали ПСН</param> /// <returns>Ссылка на репозиторий</returns> /// <exception cref="Exception">Может возникнуть исключение, если не удается открыть репозиторий</exception> public IRepository GetFtpClientRepository(string ftpHost, int ftpPort, string ftpUsername, string ftpPassword, int deviceNumber, string locomotiveName, string sectionName, IPsnProtocolConfig psnConfiguration) { var bw = new BackgroundQueueWorker <Action>(a => a()); var deviceId = new IdentifierGuidBased(Guid.NewGuid()); return(new RelayRepository(_psnInternalConfigurations.Value, () => { try { if (psnConfiguration == null) { throw new Exception("Ошибка, при обращении к устройству необходимо вручную указать конфигурацию ПСН"); } var deviceInformationStorage = new DeviceInformationStorageCustomSingle(locomotiveName, sectionName, deviceId.ToString()); var deviceInformationStorageCache = new DeviceInformationStorageRelayMemoryCache(deviceInformationStorage); var ftpFilesStorage = new FtpFilesStorageLazyCached( new FtpFilesStorageSimple( ftpHost, ftpPort, ftpUsername, ftpPassword, deviceNumber + "/")); var psnDataStorage = new StreamReadableDataStorageFtpUrl(ftpFilesStorage, deviceNumber); var psnDataStorageCache = new StreamedDataStorageRelayMemoryCache(psnDataStorage); var psnDataInfosStorage = new PsnDataInformationStorageFtpUrl(ftpFilesStorage, deviceNumber, deviceId.ToString()); var psnDataInfosStorageCache = new PsnDataInformationStorageRelayMemoryCache(psnDataInfosStorage); var psnDataCustomInfoStorage = new PsnDataCustomConfigurationsStoragePredefined( psnDataInfosStorageCache.PsnDataInformations.Select( pdi => new PsnDataCustomConfigurationSimple(pdi.Id, new IdentifierStringBased(psnConfiguration.Id.ToString()), string.Empty))); var psnDataCustomInfoStorageCache = new PsnDataCustomConfigurationsStorageRelayMemoryCache(psnDataCustomInfoStorage); return new ReposetoryOpenedResultSimple( psnDataStorageCache, psnDataInfosStorageCache, deviceInformationStorageCache, psnDataCustomInfoStorageCache, new PsnInternalConfigurationsStorageRelay(_psnInternalConfigurations.Value)); } catch (Exception ex) { throw new Exception("Не удалось открыть устройство по указанному пути: " + ftpHost + ":" + ftpPort, ex); } } , new KeyValueStorageHolderMemory() , bw , bw , "FtpClient@" + ftpHost + ":" + ftpPort + "[deviceNumber=" + deviceNumber + "]")); }
/// <summary> /// Получает ссылку на репозиторий устройства РПД /// </summary> /// <param name="nandPath">Путь к устройству РПД</param> /// <param name="psnConfiguration">Конфигурация ПСН применяемая ко всем данным NAND</param> /// <returns>Ссылка на репозиторий</returns> public IRepository GetNandFlashRepository(string nandPath, IPsnProtocolConfig psnConfiguration) { var bw = new BackgroundQueueWorker <Action>(a => a()); var deviceId = new IdentifierGuidBased(Guid.NewGuid()); return(new RelayRepository(_psnInternalConfigurations.Value, () => { try { if (psnConfiguration == null) { throw new Exception("Ошибка, при обращении к устройству необходимо вручную указать конфигурацию ПСН"); } var deviceInformationStorage = new DeviceInformationStorageNand(nandPath, deviceId.ToString()); var deviceInformationStorageCache = new DeviceInformationStorageRelayMemoryCache(deviceInformationStorage); var psnDataStorage = new StreamReadableDataStorageNand(nandPath); var psnDataStorageCache = new StreamedDataStorageRelayMemoryCache(psnDataStorage); var psnDataInfosStorage = new PsnDataInformationStorageNand(nandPath, deviceId.ToString()); var psnDataInfosStorageCache = new PsnDataInformationStorageRelayMemoryCache(psnDataInfosStorage); var psnDataCustomInfoStorage = new PsnDataCustomConfigurationsStoragePredefined( psnDataInfosStorageCache.PsnDataInformations.Select( pdi => new PsnDataCustomConfigurationSimple(pdi.Id, new IdentifierStringBased(psnConfiguration.Id.ToString()), string.Empty))); var psnDataCustomInfoStorageCache = new PsnDataCustomConfigurationsStorageRelayMemoryCache(psnDataCustomInfoStorage); return new ReposetoryOpenedResultSimple( psnDataStorageCache, psnDataInfosStorageCache, deviceInformationStorageCache, psnDataCustomInfoStorageCache, new PsnInternalConfigurationsStorageRelay(_psnInternalConfigurations.Value)); } catch (Exception ex) { throw new Exception("Не удалось открыть устройство по указанному пути: " + nandPath, ex); } } , new KeyValueStorageHolderMemory() , bw , bw , "NAND@" + nandPath)); }