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

Last change on this file since 1682 was 1682, checked in by Paul Lelgemann, 12 years ago

o Work on the distributed KeySearcher presentation

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