source: trunk/CrypPlugins/KeySearcher/P2P/Tree/KeyPoolTree.cs @ 1709

Last change on this file since 1709 was 1709, checked in by Paul Lelgemann, 11 years ago

o KeySearcher: small visualization fixes

File size: 4.6 KB
Line 
1using System;
2using System.Collections.Generic;
3using Cryptool.PluginBase;
4using KeySearcher.Helper;
5using KeySearcher.KeyPattern;
6using KeySearcher.P2P.Presentation;
7using KeySearcher.P2P.Storage;
8
9namespace KeySearcher.P2P.Tree
10{
11    internal class KeyPoolTree
12    {
13        private readonly KeySearcher keySearcher;
14        private readonly StatusContainer statusContainer;
15        private readonly StatisticsGenerator statisticsGenerator;
16        private readonly KeyPatternPool patternPool;
17        private readonly NodeBase rootNode;
18        private readonly StorageHelper storageHelper;
19        private readonly string identifier;
20
21        private NodeBase currentNode;
22        private bool skippedReservedNodes;
23
24        public KeyPoolTree(KeyPatternPool patternPool, KeySearcher keySearcher, KeyQualityHelper keyQualityHelper, StorageKeyGenerator identifierGenerator, StatusContainer statusContainer, StatisticsGenerator statisticsGenerator)
25        {
26            this.patternPool = patternPool;
27            this.keySearcher = keySearcher;
28            this.statusContainer = statusContainer;
29            this.statisticsGenerator = statisticsGenerator;
30            identifier = identifierGenerator.Generate();
31
32            storageHelper = new StorageHelper(keySearcher, statisticsGenerator, statusContainer);
33            skippedReservedNodes = false;
34
35            statisticsGenerator.MarkStartOfNodeSearch();
36            rootNode = NodeFactory.CreateNode(storageHelper, keyQualityHelper, null, 0, this.patternPool.Length - 1,
37                                              identifier);
38            statisticsGenerator.MarkEndOfNodeSearch();
39
40            currentNode = rootNode;
41        }
42
43        public DateTime StartDate()
44        {
45            return storageHelper.StartDate(identifier);
46        }
47
48        public Leaf FindNextLeaf()
49        {
50            statusContainer.IsSearchingForReservedNodes = false;
51            statisticsGenerator.MarkStartOfNodeSearch();
52
53            var nodeBeforeStarting = currentNode;
54            var foundNode = FindNextLeaf(false);
55
56            if (foundNode == null && skippedReservedNodes)
57            {
58                keySearcher.GuiLogMessage("Searching again with reserved nodes enabled...", NotificationLevel.Info);
59
60                currentNode = nodeBeforeStarting;
61                statusContainer.IsSearchingForReservedNodes = true;
62                foundNode = FindNextLeaf(true);
63                currentNode = foundNode;
64
65                statisticsGenerator.MarkEndOfNodeSearch();
66                return foundNode;
67            }
68
69            currentNode = foundNode;
70
71            statisticsGenerator.MarkEndOfNodeSearch();
72            return foundNode;
73        }
74
75        private Leaf FindNextLeaf(bool useReservedLeafs)
76        {
77            if (currentNode == null)
78            {
79                return null;
80            }
81
82            var isReserved = false;
83            storageHelper.UpdateFromDht(currentNode, true);
84            currentNode.UpdateCache();
85            while (currentNode.IsCalculated() || (!useReservedLeafs && (isReserved = currentNode.IsReserverd())))
86            {
87                if (isReserved)
88                    skippedReservedNodes = true;
89
90                // Current node is calculated or reserved,
91                // move one node up and update it
92                currentNode = currentNode.ParentNode;
93
94                // Root node calculated => everything finished
95                if (currentNode == null)
96                {
97                    currentNode = rootNode;
98                    return null;
99                }
100
101                // Update the new _currentNode
102                storageHelper.UpdateFromDht(currentNode, true);
103                currentNode.UpdateCache();
104            }
105
106            // currentNode is calculateable => find leaf
107            currentNode.UpdateCache();
108            return currentNode.CalculatableLeaf(useReservedLeafs);
109        }
110
111
112        internal bool IsCalculationFinished()
113        {
114            storageHelper.UpdateFromDht(rootNode, true);
115            return rootNode.IsCalculated();
116        }
117
118        internal void Reset()
119        {
120            rootNode.Reset();
121            currentNode = rootNode;
122            skippedReservedNodes = false;
123        }
124
125        public static void ProcessCurrentPatternCalculationResult(Leaf currentLeaf,
126                                                                  LinkedList<KeySearcher.ValueKey> result)
127        {
128            currentLeaf.HandleResults(result);
129        }
130    }
131}
Note: See TracBrowser for help on using the repository browser.