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

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

o Refactored distributed KeySearcher: updated directory structure and variable names

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