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

Last change on this file since 2152 was 2152, checked in by nolte, 11 years ago

Versionnumbers final version.
Use of the versionnumber starts this evening (7-8 PM).

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