private void WatchThread(CancellationToken token)
        {
            for (; ;)
            {
                var searchItems = new List <SearchListViewItemInfo>();

                {
                    var seedInfos = new HashSet <(Seed, Signature)>();

                    var storeMetadatas       = new HashSet <Metadata>();
                    var cacheMetadatas       = new HashSet <Metadata>();
                    var downloadingMetadatas = new HashSet <Metadata>();
                    var downloadedMetadatas  = new HashSet <Metadata>();

                    foreach (var store in _messageManager.GetStores())
                    {
                        var seedHashSet = new HashSet <Seed>();
                        {
                            var boxList = new List <Box>();
                            boxList.AddRange(store.Value.Boxes);

                            for (int i = 0; i < boxList.Count; i++)
                            {
                                boxList.AddRange(boxList[i].Boxes);
                                seedHashSet.UnionWith(boxList[i].Seeds);
                            }
                        }

                        foreach (var seed in seedHashSet)
                        {
                            seedInfos.Add((seed, store.AuthorSignature));
                            storeMetadatas.Add(seed.Metadata);
                        }
                    }

                    {
                        var signature = SettingsManager.Instance.AccountSetting.DigitalSignature.GetSignature();

                        foreach (var seed in _amoebaInterfaceManager.GetCacheContentReports()
                                 .Select(n => new Seed(Path.GetFileName(n.Path), n.Length, n.CreationTime, n.Metadata)).ToArray())
                        {
                            seedInfos.Add((seed, signature));
                            cacheMetadatas.Add(seed.Metadata);
                        }
                    }

                    downloadingMetadatas.UnionWith(_amoebaInterfaceManager.GetDownloadContentReports().Select(n => n.Metadata));

                    {
                        var downloadedSeeds = SettingsManager.Instance.DownloadedSeeds.ToArray();

                        foreach (var seed in SettingsManager.Instance.DownloadedSeeds.ToArray())
                        {
                            if (!storeMetadatas.Contains(seed.Metadata) && !cacheMetadatas.Contains(seed.Metadata))
                            {
                                seedInfos.Add((seed, null));
                            }

                            downloadedMetadatas.Add(seed.Metadata);
                        }
                    }

                    foreach (var(seed, signature) in seedInfos)
                    {
                        var viewModel = new SearchListViewItemInfo();
                        viewModel.Icon         = IconUtils.GetImage(seed.Name);
                        viewModel.Name         = seed.Name;
                        viewModel.Signature    = signature;
                        viewModel.Length       = seed.Length;
                        viewModel.CreationTime = seed.CreationTime;

                        SearchState state = 0;
                        if (storeMetadatas.Contains(seed.Metadata))
                        {
                            state |= SearchState.Store;
                        }
                        if (cacheMetadatas.Contains(seed.Metadata))
                        {
                            state |= SearchState.Cache;
                        }
                        if (downloadingMetadatas.Contains(seed.Metadata))
                        {
                            state |= SearchState.Downloading;
                        }
                        if (downloadedMetadatas.Contains(seed.Metadata))
                        {
                            state |= SearchState.Downloaded;
                        }

                        viewModel.State = state;
                        viewModel.Model = seed;

                        searchItems.Add(viewModel);
                    }
                }

                lock (_cache_SearchItems.LockObject)
                {
                    _cache_SearchItems.Clear();
                    _cache_SearchItems.AddRange(searchItems);
                }

                this.SetCount(this.TabViewModel.Value, searchItems, token);

                if (token.WaitHandle.WaitOne(1000 * 20))
                {
                    return;
                }
            }
        }
예제 #2
0
        private void WatchThread(CancellationToken token)
        {
            for (; ;)
            {
                var subscribeStoreInfos = new List <StoreSignatureInfo>();

                try
                {
                    App.Current.Dispatcher.Invoke(() =>
                    {
                        if (token.IsCancellationRequested)
                        {
                            return;
                        }

                        var subscribeCategoryInfos = new List <StoreCategoryInfo>();
                        subscribeCategoryInfos.Add(this.TabViewModel.Value.Model);

                        for (int i = 0; i < subscribeCategoryInfos.Count; i++)
                        {
                            subscribeCategoryInfos.AddRange(subscribeCategoryInfos[i].CategoryInfos);
                            subscribeStoreInfos.AddRange(subscribeCategoryInfos[i].SignatureInfos);
                        }
                    }, DispatcherPriority.Background, token);
                }
                catch (OperationCanceledException)
                {
                    return;
                }

                foreach (var storeInfo in subscribeStoreInfos)
                {
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }

                    var message = _amoebaInterfaceManager.GetStore(storeInfo.AuthorSignature, CancellationToken.None).Result;
                    if (message == null || storeInfo.UpdateTime == message.CreationTime)
                    {
                        continue;
                    }

                    var tempBoxInfos = new List <StoreBoxInfo>();

                    foreach (var targetBox in message.Value.Boxes)
                    {
                        tempBoxInfos.Add(CreateStoreBoxInfo(targetBox, storeInfo.BoxInfos.FirstOrDefault(n => n.Name == targetBox.Name)));
                    }

                    try
                    {
                        App.Current.Dispatcher.Invoke(() =>
                        {
                            if (token.IsCancellationRequested)
                            {
                                return;
                            }

                            storeInfo.UpdateTime = message.CreationTime;
                            storeInfo.IsUpdated  = true;
                            storeInfo.BoxInfos.Clear();
                            storeInfo.BoxInfos.AddRange(tempBoxInfos);

                            // Refresh
                            {
                                if (this.TabSelectedItem.Value is StoreSignatureViewModel selectedSignatureViewModel)
                                {
                                    if (selectedSignatureViewModel.Model == storeInfo)
                                    {
                                        this.Refresh();
                                    }
                                }
                                else if (this.TabSelectedItem.Value is StoreBoxViewModel selectedBoxViewModel)
                                {
                                    if (selectedBoxViewModel.GetAncestors().OfType <StoreSignatureViewModel>().First().Model == storeInfo)
                                    {
                                        this.Refresh();
                                    }
                                }
                            }
                        }, DispatcherPriority.Background, token);
                    }
                    catch (OperationCanceledException)
                    {
                        return;
                    }
                }

                {
                    var cacheMetadatas = new HashSet <Metadata>();
                    cacheMetadatas.UnionWith(_amoebaInterfaceManager.GetCacheContentReports().Select(n => n.Metadata));

                    var downloadingMetadatas = new HashSet <Metadata>();
                    downloadingMetadatas.UnionWith(_amoebaInterfaceManager.GetDownloadContentReports().Select(n => n.Metadata));

                    var downloadedMetadatas = new HashSet <Metadata>();
                    downloadedMetadatas.UnionWith(SettingsManager.Instance.DownloadedSeeds.Select(n => n.Metadata));

                    lock (_cacheStates.LockObject)
                    {
                        _cacheStates.Clear();

                        foreach (var metadata in cacheMetadatas)
                        {
                            _cacheStates.Add(metadata, SearchState.Cache);
                        }

                        foreach (var metadata in downloadingMetadatas)
                        {
                            _cacheStates.AddOrUpdate(metadata, SearchState.Downloading, (_, oldValue) => oldValue | SearchState.Downloading);
                        }

                        foreach (var metadata in downloadedMetadatas)
                        {
                            _cacheStates.AddOrUpdate(metadata, SearchState.Downloaded, (_, oldValue) => oldValue | SearchState.Downloaded);
                        }
                    }
                }

                if (token.WaitHandle.WaitOne(1000 * 30))
                {
                    return;
                }
            }
        }
예제 #3
0
        private void UpdateSearchListViewItemInfos()
        {
            var searchItems = new List <SearchListViewItemInfo>();

            {
                var seedInfos = new HashSet <(Seed, Signature)>();

                var storeMetadatas       = new HashSet <Metadata>();
                var cacheMetadatas       = new HashSet <Metadata>();
                var downloadingMetadatas = new HashSet <Metadata>();
                var downloadedMetadatas  = new HashSet <Metadata>();

                foreach (var store in this.GetStores())
                {
                    var seedHashSet = new HashSet <Seed>();
                    {
                        var boxList = new List <Box>();
                        boxList.AddRange(store.Value.Boxes);

                        for (int i = 0; i < boxList.Count; i++)
                        {
                            boxList.AddRange(boxList[i].Boxes);
                            seedHashSet.UnionWith(boxList[i].Seeds);
                        }
                    }

                    foreach (var seed in seedHashSet)
                    {
                        seedInfos.Add((seed, store.AuthorSignature));
                        storeMetadatas.Add(seed.Metadata);
                    }
                }

                {
                    var signature = SettingsManager.Instance.AccountInfo.DigitalSignature.GetSignature();

                    foreach (var seed in _serviceManager.GetCacheContentReports()
                             .Select(n => new Seed(Path.GetFileName(n.Path), n.Length, n.CreationTime, n.Metadata)).ToArray())
                    {
                        seedInfos.Add((seed, signature));
                        cacheMetadatas.Add(seed.Metadata);
                    }
                }

                downloadingMetadatas.UnionWith(_serviceManager.GetDownloadContentReports().Select(n => n.Metadata));

                {
                    var downloadedSeeds = SettingsManager.Instance.DownloadedSeeds.ToArray();

                    foreach (var seed in SettingsManager.Instance.DownloadedSeeds.ToArray())
                    {
                        if (!storeMetadatas.Contains(seed.Metadata) && !cacheMetadatas.Contains(seed.Metadata))
                        {
                            seedInfos.Add((seed, null));
                        }

                        downloadedMetadatas.Add(seed.Metadata);
                    }
                }

                foreach (var(seed, signature) in seedInfos)
                {
                    var viewModel = new SearchListViewItemInfo();
                    viewModel.Name         = seed.Name;
                    viewModel.Signature    = signature;
                    viewModel.Length       = seed.Length;
                    viewModel.CreationTime = seed.CreationTime;

                    SearchState state = 0;
                    if (storeMetadatas.Contains(seed.Metadata))
                    {
                        state |= SearchState.Store;
                    }
                    if (cacheMetadatas.Contains(seed.Metadata))
                    {
                        state |= SearchState.Cache;
                    }
                    if (downloadingMetadatas.Contains(seed.Metadata))
                    {
                        state |= SearchState.Downloading;
                    }
                    if (downloadedMetadatas.Contains(seed.Metadata))
                    {
                        state |= SearchState.Downloaded;
                    }

                    viewModel.State = state;
                    viewModel.Model = seed;

                    searchItems.Add(viewModel);
                }
            }

            lock (_cacheSearchListViewItemInfos.LockObject)
            {
                _cacheSearchListViewItemInfos.Clear();
                _cacheSearchListViewItemInfos.AddRange(searchItems);
            }
        }