public void DownloadDependencies()
        {
            Task.Run(async() =>
            {
                if (await CheckLogin(1) < 0 || App.IsDownloading)
                {
                    App.Window.Dispatcher.Invoke(() =>
                    {
                        MainWindow.ScanRailworks.IsEnabled           = true;
                        MainWindow.SelectRailworksLocation.IsEnabled = true;
                        MainWindow.DownloadMissing.IsEnabled         = true;
                    });
                    return;
                }

                int maxThreads = Math.Min(Environment.ProcessorCount, DownloadableDeps.Count);
                Parallel.For(0, maxThreads, workerId =>
                {
                    int max = DownloadableDeps.Count * (workerId + 1) / maxThreads;
                    for (int i = DownloadableDeps.Count * workerId / maxThreads; i < max; i++)
                    {
                        Task.Run(async() =>
                        {
                            string dependency = DownloadableDeps.ElementAt(i);
                            List <int> pkgId  = await FindFile(dependency);

                            if (pkgId.Count >= 0)
                            {
                                lock (PkgsToDownload)
                                {
                                    PkgsToDownload.UnionWith(pkgId);
                                }
                            }
                        }).Wait();
                    }
                });

                if (PkgsToDownload.Count > 0)
                {
                    App.IsDownloading = true;
                    MainWindow.Dispatcher.Invoke(() => { MainWindow.DownloadDialog.ShowAsync(); }); // TODO: Check if works
                    MainWindow.DownloadDialog.DownloadPackages(PkgsToDownload, CachedPackages, InstalledPackages, WebWrapper, SqLiteAdapter).Wait();
                    App.IsDownloading = false;
                    MainWindow.RW_CrawlingComplete();
                }
                else
                {
                    new Task(() =>
                    {
                        App.Window.Dispatcher.Invoke(() =>
                        {
                            MainWindow.ErrorDialog = new ContentDialog()
                            {
                                Title               = "Cannot download packages",
                                Content             = "All availaible packages were downloaded.",
                                SecondaryButtonText = "OK",
                                Owner               = App.Window
                            };

                            MainWindow.ErrorDialog.ShowAsync();
                        });

                        MainWindow.Dispatcher.Invoke(() =>
                        {
                            MainWindow.ScanRailworks.IsEnabled           = true;
                            MainWindow.SelectRailworksLocation.IsEnabled = true;
                        });
                    }).Start();
                }
            });
        }
Exemple #2
0
        public async Task VerifyCache()
        {
            List <Package> localCache = SqLiteAdapter.LoadPackages(true);

            ServerVersions = new Dictionary <int, int>();
            localCache.ForEach(x => ServerVersions[x.PackageId] = x.Version);
            Tuple <IEnumerable <Package>, HashSet <int> > tRemoteCache = await WebWrapper.ValidateCache(ServerVersions);

            IEnumerable <Package> remoteCache    = tRemoteCache.Item1;
            HashSet <int>         remoteVersions = tRemoteCache.Item2;

            lock (CachedPackages)
            {
                CachedPackages = remoteCache.ToList();
                localCache.ForEach(x =>
                {
                    if (!remoteVersions.Contains(x.PackageId))
                    {
                        CachedPackages.Add(x);
                    }
                    else
                    {
                        ServerVersions[x.PackageId] = CachedPackages.First(y => y.PackageId == x.PackageId).Version;
                    }
                });
                foreach (Package pkg in remoteCache)
                {
                    ServerVersions[pkg.PackageId] = pkg.Version;
                }
            }
            if (remoteVersions.Count > 0)
            {
                new Task(() =>
                {
                    foreach (Package pkg in CachedPackages)
                    {
                        SqLiteAdapter.SavePackage(pkg, true);
                    }
                    SqLiteAdapter.FlushToFile(true);
                }).Start();
            }
            CachedPackages.ForEach(x =>
            {
                if (x.IsPaid)
                {
                    x.FilesContained.ForEach(y =>
                    {
                        DownloadablePaidDepsPackages[y] = x.PackageId;
                        DownloadablePaidDeps.Add(y);
                    });
                }
                else
                {
                    x.FilesContained.ForEach(y =>
                    {
                        DownloadableDepsPackages[y] = x.PackageId;
                        DownloadableDeps.Add(y);
                    });
                }
            });
        }