source: trunk/CrypPlugins/KeySearcher/P2P/Tree/Node.cs @ 2295

Last change on this file since 2295 was 2295, checked in by Sven Rech, 11 years ago

Prepared KeySearcher for Localization

File size: 4.5 KB
Line 
1using System;
2using System.Numerics;
3using KeySearcher.Helper;
4using KeySearcher.P2P.Exceptions;
5using KeySearcher.P2P.Storage;
6using KeySearcher.Properties;
7
8namespace KeySearcher.P2P.Tree
9{
10    class Node : NodeBase
11    {
12        internal bool LeftChildFinished;
13        internal bool RightChildFinished;
14
15        private NodeBase leftChild;
16        private NodeBase rightChild;
17        private bool leftChildReserved;
18        private bool rightChildReserved;
19
20        public Node(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
21            : base(storageHelper, keyQualityHelper, parentNode, @from, to, distributedJobIdentifier)
22        {
23        }
24
25        private void LoadOrUpdateChildNodes()
26        {
27            try
28            {
29                var middle = (From + To) / 2;
30
31                if (!LeftChildFinished)
32                {
33                    if (leftChild == null)
34                    {
35                        leftChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, From, middle,
36                                                            DistributedJobIdentifier);
37                    }
38                    else
39                    {
40                        StorageHelper.UpdateFromDht(leftChild);
41                    }
42                }
43
44                // Only load right node, if the left one is finished or reserved
45                if ((LeftChildFinished || leftChild.IsReserved()) && !RightChildFinished)
46                {
47                    if (rightChild == null)
48                    {
49                        rightChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, middle + 1, To,
50                                                             DistributedJobIdentifier);
51                    }
52                    else
53                    {
54                        StorageHelper.UpdateFromDht(rightChild);
55                    }
56                }
57            }
58            catch (KeySearcherStopException)
59            {
60                throw new KeySearcherStopException();
61            }               
62        }
63
64        public override bool IsCalculated()
65        {
66            return LeftChildFinished && RightChildFinished;
67        }
68
69        public override void Reset()
70        {
71            leftChild = null;
72            rightChild = null;
73        }
74
75        public override void UpdateCache()
76        {
77            LoadOrUpdateChildNodes();
78
79            leftChildReserved = LeftChildFinished || leftChild.IsReserved();
80            rightChildReserved = RightChildFinished || (rightChild != null && rightChild.IsReserved());
81        }
82
83        public override Leaf CalculatableLeaf(bool useReservedNodes)
84        {
85            // Left child not finished and not reserved (or reserved leafs are allowed)
86            if (!LeftChildFinished && (!leftChildReserved || useReservedNodes))
87            {
88                return leftChild.CalculatableLeaf(useReservedNodes);
89            }
90
91            if (rightChild == null)
92            {
93                throw new AlreadyCalculatedException();
94            }
95
96            return rightChild.CalculatableLeaf(useReservedNodes);
97        }
98
99        public void ChildFinished(NodeBase childNode)
100        {
101            if (childNode == leftChild)
102            {
103                LeftChildFinished = true;
104                leftChild = null;
105                UpdateCache();
106                return;
107            }
108
109            if (childNode == rightChild)
110            {
111                RightChildFinished = true;
112                rightChild = null;
113                UpdateCache();
114                return;
115            }
116        }
117
118        public override bool IsReserved()
119        {
120            if (LeftChildFinished && !RightChildFinished)
121            {
122                return rightChildReserved;
123            }
124
125            if (!LeftChildFinished && RightChildFinished)
126            {
127                return leftChildReserved;
128            }
129
130            if (!LeftChildFinished && !RightChildFinished && rightChildReserved)
131            {
132                return leftChildReserved;
133            }
134
135            return rightChildReserved;
136        }
137
138        public override string ToString()
139        {
140            return base.ToString() + Resources.__LeftChildFinished_ + LeftChildFinished + Resources.___RightChildFinished_ +
141                   RightChildFinished;
142        }
143    }
144}
Note: See TracBrowser for help on using the repository browser.