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

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

o Work on the distributed KeySearcher cache

File size: 4.2 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            currentNode.UpdateCache();
74            while (currentNode.IsCalculated() || (!useReservedLeafs && (isReserved = currentNode.IsReserverd())))
75            {
76                if (isReserved)
77                    skippedReservedNodes = true;
78
79                // Current node is calculated or reserved,
80                // move one node up and update it
81                currentNode = currentNode.ParentNode;
82
83                // Root node calculated => everything finished
84                if (currentNode == null)
85                {
86                    currentNode = rootNode;
87                    return null;
88                }
89
90                // Update the new _currentNode
91                storageHelper.UpdateFromDht(currentNode, true);
92                currentNode.UpdateCache();
93            }
94
95            // currentNode is calculateable => find leaf
96            currentNode.UpdateCache();
97            return currentNode.CalculatableLeaf(useReservedLeafs);
98        }
99
100
101        internal bool IsCalculationFinished()
102        {
103            storageHelper.UpdateFromDht(rootNode, true);
104            return rootNode.IsCalculated();
105        }
106
107        internal void Reset()
108        {
109            rootNode.Reset();
110            currentNode = rootNode;
111            skippedReservedNodes = false;
112        }
113
114        public static void ProcessCurrentPatternCalculationResult(Leaf currentLeaf,
115                                                                  LinkedList<KeySearcher.ValueKey> result)
116        {
117            currentLeaf.HandleResults(result);
118        }
119    }
120}
Note: See TracBrowser for help on using the repository browser.