Пример #1
0
        private async Task MatchPackageFileAsync(VarPackage package, VarPackageFile packageFile, ConcurrentDictionary <string, List <FreeFile> > freeFilesSet)
        {
            if (!freeFilesSet.TryGetValue(packageFile.FilenameLower, out var matchingFreeFiles))
            {
                return;
            }

            await Task.WhenAll(matchingFreeFiles.SelectMany(m => m.SelfAndChildren()).Where(m => m.Hash == null).Select(async m => await ComputeHashAsync(m)));

            var matchedFreeFiles = matchingFreeFiles
                                   .Where(ff => ff.Hash == packageFile.Hash)
                                   .Where(ff =>
            {
                if (ff.Children == null || ff.Children.Count == 0)
                {
                    return(true);
                }
                foreach (var child in ff.Children)
                {
                    if (!package.Files.Any(pf => pf.FilenameLower == child.FilenameLower && pf.Hash == child.Hash))
                    {
                        return(false);
                    }
                }
                return(true);
            })
                                   .ToList();

            if (matchedFreeFiles.Count == 0)
            {
                return;
            }

            _matches.Add(new FreeFilePackageMatch(
                             package,
                             packageFile,
                             matchedFreeFiles));
        }
Пример #2
0
        private async Task MatchPackageAsync(IProgress <ProgressInfo> reporter, VarPackage package, int packagesCount, ConcurrentDictionary <string, List <FreeFile> > freeFilesSet)
        {
            reporter.Report(new ProgressInfo(Interlocked.Increment(ref _processed), packagesCount, package.Name.Filename));

            await Task.WhenAll(package.Files.Select(async f => await MatchPackageFileAsync(package, f, freeFilesSet)));
        }