public void GetAvailableServices() { try { // Clear the list AvailableServices.Clear(); // Get list of known providers of BIM Bot services from GitHub string resstr = ResponseOfGetRequest("https://raw.githubusercontent.com/opensourceBIM/BIMserver-Repository/master/serviceproviders.json"); if (resstr != null) { // modify the response to add the ifcanalysis provider for now (TODO remove in future) resstr = resstr.Insert(resstr.LastIndexOf(']'), ", {\n" + "\"name\": \"ifcanalysis.bimserver.services\", \n" + "\"description\": \"Experimental services provider\", \n" + "\"listUrl\": \"https://ifcanalysis.bimserver.services/servicelist\"\n" + "}"); // Deserialize the JSON response JsonProviderList gitProviders = JsonConvert.DeserializeObject <JsonProviderList>(resstr); // Insert services of each provider foreach (JsonProvider provider in gitProviders.active) { JsonServiceList serviceList = provider.GetJsonServices(); if (serviceList != null) { // Add each service in the list from the JSON response foreach (Service service in serviceList.Services) { // Add the service to the service list AvailableServices.Add(service); } } } } // add the provider of Kalkzandsteen bot (Thomas) for now (TODO remove in future) InsertFixedBotThomas(); } catch (Exception e) { Console.Write(e); } }
public MainPageViewModel(IServiceProvider serviceProvider, AppViewModel appViewModel) : base(serviceProvider, appViewModel) { m_connectionInfoProperty = CreateDictionaryProperty(() => ConnectionInfo, () => null); m_connectionInfoTaskStatusProperty = CreateDictionaryProperty(() => ConnectionInfoTaskStatus, () => TaskStatus.Created); m_dhcpInfoProperty = CreateDictionaryProperty(() => DhcpInfo, () => null); m_dhcpInfoTaskStatusProperty = CreateDictionaryProperty(() => DhcpInfoTaskStatus, () => TaskStatus.Created); m_externalAddressProperty = CreateDictionaryProperty(() => ExternalAddress, () => null); m_externalAddressTaskStatusProperty = CreateDictionaryProperty(() => ExternalAddressTaskStatus, () => TaskStatus.Created); m_statusProperty = CreateDictionaryProperty(() => Status, () => String.Empty); m_progressPercentProperty = CreateDictionaryProperty(() => ProgressPercent, () => 0.0d); m_isScanInProgressProperty = CreateDictionaryProperty(() => IsScanInProgress, () => false); m_customSelectionCommandsProperty = CreateDictionaryProperty(() => CustomSelectionCommands, () => new ObservableCollection <UICommand>()); m_startAddressValueProperty = CreateSettingsProperty(V1SettingsConstants.StartAddressValueKey, () => StartAddressValue, () => 0u, () => { UpdateActionBarControls(); }); m_isStartAddressValidProperty = CreateDictionaryProperty(() => IsStartAddressValid, () => false); m_endAddressValueProperty = CreateSettingsProperty(V1SettingsConstants.EndAddressValueKey, () => EndAddressValue, () => 0u, () => { UpdateActionBarControls(); }); m_isEndAddressValidProperty = CreateDictionaryProperty(() => IsEndAddressValid, () => false); var hostInfoService = ServiceProvider.GetService <IHostInfoService>(); var hostInfo = hostInfoService.GetCurrentHostInfo(); if (hostInfo == null) { Status = Strings.Status_GetHostInfoFailed; } else { var connectionInfoTask = RunGetConnectionInfoAsync(hostInfo); var dhcpInfoTask = RunGetDhcpInfoAsync(hostInfo); var externalAddressTask = RunGetExternalAddressAsync(); Task.Factory.ContinueWhenAll(new[] { connectionInfoTask, dhcpInfoTask }, t => { if (ConnectionInfo != null) { if (DhcpInfo != null && DhcpInfo.DnsServerAddress != null) { m_dnsResolver = new UdpDnsResolver( new DnsResolverOptions(), new DatagramSocketFactory(), new IPEndpoint(DhcpInfo.DnsServerAddress, Constants.DefaultDnsPort)); } SetAddressValues(ConnectionInfo.Network); IsScanInProgress = false; m_isScanCommandEnabled = true; m_scanCommand.Refresh(); m_isCancelScanCommandEnabled = false; m_cancelScanCommand.Refresh(); } }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); } m_scanCommand = new DelegateCommand(async() => { var scanStopwatch = new Stopwatch(); scanStopwatch.Start(); m_tokenSource = new CancellationTokenSource(); AvailableServices.Clear(); IsScanInProgress = true; m_isScanCommandEnabled = false; m_scanCommand.Refresh(); m_isCancelScanCommandEnabled = true; m_cancelScanCommand.Refresh(); Status = Strings.Status_ScanStarted; var selectedAddresses = new IPAddressRange(StartAddressValue, EndAddressValue); var networkServices = await GetNetworkServicesAsync(); var index = 0; var progress = (IProgress <ScanNetworkBatch>) new Progress <ScanNetworkBatch>(batch => { foreach (var result in batch.Results) { if (result.IsAvailable) { AvailableServices.Add(result); } } index += batch.Results.Count; ProgressPercent = 100.0d * index / (selectedAddresses.Count * networkServices.Length); }); var task = Task.Factory.StartNew( arg => { Scanner.ScanNetwork(m_tokenSource.Token, m_dnsResolver, selectedAddresses, networkServices, progress); }, m_tokenSource.Token, TaskCreationOptions.None); var t1 = task.ContinueWith(t => { IsScanInProgress = false; m_isScanCommandEnabled = true; m_scanCommand.Refresh(); m_isCancelScanCommandEnabled = false; m_cancelScanCommand.Refresh(); var isCancelled = m_tokenSource.Token.IsCancellationRequested; if (isCancelled) { Status = Strings.Status_ScanCancelled; ProgressPercent = 0.0d; } else { scanStopwatch.Stop(); var timeSpan = scanStopwatch.Elapsed; Status = Strings.Format_Status_ScanCompleted(timeSpan); ProgressPercent = 100.0d; } m_tokenSource.Dispose(); }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); }, () => m_isScanCommandEnabled); m_cancelScanCommand = new DelegateCommand(() => { m_isCancelScanCommandEnabled = false; m_cancelScanCommand.Refresh(); m_tokenSource.Cancel(); }, () => m_isCancelScanCommandEnabled); m_showServicesCommand = new DelegateCommand(() => { AppViewModel.NavigateToServicesPage(); }); m_launchUriCommand = new DelegateCommand <IPEndpoint>(endpoint => { AppViewModel.NavigateToBrowserPage(endpoint); }); }