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

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

Full working Versionnumber code added.
INFO: THE UNCOMMENTED UPDATE WILL BE COMITTED THURSDAY 8PM (20Uhr :P )
PLEASE UPDATE YOUR SVN AFTERWARDS!

File size: 4.6 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            try
77            {
78                LoadOrUpdateChildNodes();
79            }
80            catch (KeySearcherStopException)
81            {
82                throw new KeySearcherStopException();
83            }
84
85            leftChildReserved = LeftChildFinished || leftChild.IsReserved();
86            rightChildReserved = RightChildFinished || (rightChild != null && rightChild.IsReserved());
87        }
88
89        public override Leaf CalculatableLeaf(bool useReservedNodes)
90        {
91            // Left child not finished and not reserved (or reserved leafs are allowed)
92            if (!LeftChildFinished && (!leftChildReserved || useReservedNodes))
93            {
94                return leftChild.CalculatableLeaf(useReservedNodes);
95            }
96
97            if (rightChild == null)
98            {
99                throw new AlreadyCalculatedException();
100            }
101
102            return rightChild.CalculatableLeaf(useReservedNodes);
103        }
104
105        public void ChildFinished(NodeBase childNode)
106        {
107            if (childNode == leftChild)
108            {
109                LeftChildFinished = true;
110                leftChild = null;
111                UpdateCache();
112                return;
113            }
114
115            if (childNode == rightChild)
116            {
117                RightChildFinished = true;
118                rightChild = null;
119                UpdateCache();
120                return;
121            }
122        }
123
124        public override bool IsReserved()
125        {
126            if (LeftChildFinished && !RightChildFinished)
127            {
128                return rightChildReserved;
129            }
130
131            if (!LeftChildFinished && RightChildFinished)
132            {
133                return leftChildReserved;
134            }
135
136            if (!LeftChildFinished && !RightChildFinished && rightChildReserved)
137            {
138                return leftChildReserved;
139            }
140
141            return rightChildReserved;
142        }
143
144        public override string ToString()
145        {
146            return base.ToString() + ", LeftChildFinished " + LeftChildFinished + ",  RightChildFinished " +
147                   RightChildFinished;
148        }
149    }
150}
Note: See TracBrowser for help on using the repository browser.