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