source: trunk/CrypPlugins/KeySearcher/P2P/Nodes/Node.cs @ 1671

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

o Work on the distributed KeySearcher

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